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两次使用 collectionBC.
  • 然后$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 回答