首页 > 解决方案 > 如何将查找文档中的字符串字段收集到 MongoDb 中根文档的数组字段中

问题描述

样本数据集

有第一组文件SET A

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123456",
"baseId" : "123-123-123-123",
"name" : "test for 1",
"category" : "default"
}

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123456",
"baseId" : "124-124-124-124",
"name" : "test for 2",
"category" : "default"}

还有第二组文档SET B与SET A文档的docId键具有多对一关系

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123456",
"collect" : "abcd",
"name" : "test for date format"}

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123456",
"collect" : "bcde",
"name" : "test for date format"}

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123457",
"collect" : "abcd",
"name" : "test for date format"}

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123457",
"collect" : "bcdef",
"name" : "test for date format",}

需要将结果文档作为SET A文档,其中包含来自SET B文档的额外字段聚合,其中所有 SET B 文档的收集键应添加到结果文档的数组字段中

例如:生成的文档应该将与docId匹配的每个SET B文档中的收集键值推送(不同)到collectArray

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123456",
"baseId" : "123-123-123-123",
"name" : "test for 1",
"category" : "default"
"collectArray" : ["abcd", "bcde"]
}

{"_id" : ObjectId("56b872f475a4b3000326080e"),
"docId" : "123457",
"baseId" : "124-124-124-124",
"name" : "test for 2",
"category" : "default"
"collectArray" : ["abcd", "bcdef"]
}

尝试使用查找的方法:

 {
    $lookup: {
        from: "set2collection",
        localField: "docId",
        foreignField: "docId",
        as: "lookups"
    }
}
  1. $addToSet(错误:仅适用于 $group)
  2. $addToField(找不到收集不同值的运算符)
  3. $mergeToObject(错误:用作累加器时的一元运算符)

探索原因

现有逻辑是通过首先按docId对所有SET B文档进行分组,然后应用 $addToSet 来完成的,由于SET B中的文档数量非常多,这变得非常慢。需要对其进行优化,这就是为什么考虑尝试查找的原因。

请帮助并建议当前方法或是否应采取任何其他途径。

标签: mongodbaggregation-framework

解决方案


推荐阅读