1

多くのレコードを持つ 3 つのコレクションがあります。それらのそれぞれには、価格、名前などのいくつかのキーがあります...

cご覧のとおり、他のコレクションとは異なり、コレクションに提出された価格はdata.detailフィールドにあります。

に基づいて、そこにあるコレクションの価格の平均を計算したいと考えていnameます。

最終結果は、計算された価格の製品の配列になるはずです。出来ますか?

collection a = [
{"id":1, "price": "1200", "name": "x1"},
{"id":2, "price": "2000", "name": "x2"},
{"id":3, "price": "3000", "name": "x3"},
...
] 


collection b  = [
{"id":1, "price": "1500", "name": "x1"},
{"id":2, "price": "2500", "name": "x2"},
{"id":3, "price": "3125", "name": "x3"},
...
] 

collection c  = [
  {"id":1, "data": {"detail": {"price": 1900}}, "name": "x1"},
  {"id":2, "data": {"detail": {"price": 2900}}, "name": "x2"},
  {"id":3, "data": {"detail": {"price": 3500}}, "name": "x3"},
  ...
]

私はこれを結果として持ちたい:

$result = [
{"id":1, "price": "1533.3", "name": "x1"},
{"id":2, "price": "2466.6", "name": "x2"},
{"id":2, "price": "3208.3", "name": "x3"},
...
]
4

1 に答える 1

1

このクエリを試すことができます:

  • コレクションと. $lookup_BC
  • 次に$unwind、 によって生成された配列を分解し$lookupます。
  • ここでは、データの例が文字列であるため、int 値に解析しました。タイプミスなのか、データが文字列なのかわかりません。データがすでに整数である場合、この段階を回避できます。
  • 次に、値を再グループ化し、各価格 (A、B、および C) の配列を生成します。
  • これらの配列を連結します。
  • そして平均を計算します。
db.a.aggregate([
  {
    "$lookup": {
      "from": "b",
      "localField": "name",
      "foreignField": "name",
      "as": "b"
    }
  },
  {
    "$lookup": {
      "from": "c",
      "localField": "name",
      "foreignField": "name",
      "as": "c"
    }
  },
  {
    "$unwind": "$b"
  },
  {
    "$unwind": "$c"
  },
  {
    "$set": {
      "b.price": {
        "$toInt": "$b.price"
      },
      "price": {
        "$toInt": "$price"
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "name": {
        "$first": "$name"
      },
      "id": {
        "$first": "$id"
      },
      "priceA": {
        "$push": "$price"
      },
      "priceB": {
        "$push": "$b.price"
      },
      "priceC": {
        "$push": "$c.data.detail.price"
      }
    }
  },
  {
    "$set": {
      "price": {
        "$concatArrays": [
          "$priceA",
          "$priceB",
          "$priceC"
        ]
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "id": 1,
      "name": 1,
      "price": {
        "$avg": "$price"
      }
    }
  }
])

はこちら

入力例では機能しますが、他の入力データでも機能するかどうかを確認してください。

于 2021-09-21T11:38:58.960 に答える