首页 > 解决方案 > 如何使用查找从 2 个不同的集合中获取数据,以及如何在查找中添加一些条件以根据某些条件获取数据?

问题描述

我有两个集合,如下所示:

第一集:

[{
    "UID" : 3398,
    "name" : "test"
}]

第二集:

[{
    "ques_id" : "q1",
    "ri_score" : 5.3,
    "uc_id" : 3398
},
{
    "ques_id" : "q2",
    "ri_score" : 5.3,
    "uc_id" : 3398
}]

我正在使用的查询如下:

db.first_collection.aggregate([
  {
    $lookup: {
      from: "second_collection",
      localField: "UID",
      foreignField: "uc_id",
      as: "second_collection_docs"
    }
  },
  {
    $project: {
      "UID": 1,
      "name": 1,
      "second_collection_docs.ri_score": 1
    }
  }
])

上述查询返回的数据如下所示:

{
    "UID" : 3394,
    "name" : "test",
    "second_collection_docs" : [{
            "ri_score" : "5.3"
        }, 
        {
            "ri_score" : "5.3"
        }]
}

在第二个收集数据中,它给出了 2 次相同的 ri_score,但我只想要一次。预期结果如下所示:

{
    "UID" : 3394,
    "name" : "test",
    "second_collection_docs" : [{
            "ri_score" : "5.3"
        }]
}

有什么解决方案可以让我得到预期的结果吗?先感谢您。

标签: mongodb

解决方案


也许这可以使用$addFieldsand工作$reduce

db.first_collection.aggregate([
  {}, //lookup stage
  {}, // project stage
  //Above the same query you have and here insert this stage
  {
    "$addFields": {
      "values": {
        "$reduce": {
          "input": "$values",
          "initialValue": [],
          "in": {
            "$cond": [
              {
                "$in": [
                  "$$this.ri_score",
                  "$$value.ri_score"
                ]
              },
              "$$value",
              {
                $concatArrays: [
                  "$$value",
                  [
                    "$$this"
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  }
])

基本上,这个查询添加的字段values是一个包含ri_score不重复对象的数组。

检查这个示例,其中我添加了另一个不同的对象,ri_score并检查它是否按预期工作。

还有一个你的价值观的例子是here。如您所见,ri_score不重复。


推荐阅读