首页 > 解决方案 > $merge:如何在 $merge 管道之后返回合并的文档

问题描述

请帮助!,我有两个集合称为coll1coll2。我想coll2根据coll1字段更新并返回更新的文档coll2

coll1 :[{"_id":"some_unique_id1", "plan":{"type":"premium"}},
          {"_id":"some_unique_id2", "plan":{"type":"free"}}]

coll2 :[{"_id":"some_unique_id3", "user_id":"some_unique_id1", "eligible":false}]

如果用户有高级计划,我想设置eligible: truecoll2仅从coll2.

我所做的是更新coll2但不返回更新的文档。这是我的示例代码

let data = await db.collection("coll1").aggregate([
            {
                $match: {
                    "plan.type": "premium"
                }
            },
            {
                $addFields: {
                    eligible: true
                }
            },
            {
                $project: {
                    _id: 0, user_id: "$_id", eligible: 1
                }
            },
            {
                $merge: {
                    into: "coll2",
                    on: ["user_id"],
                    whenMatched: "merge",
                }
            }

    ]).toArray();
console.log(data)

我无法做到这一点。我怎样才能做到这一点?我可以$function$merge管道中使用吗?

标签: javascriptnode.jsmongodbmongodb-queryaggregation-framework

解决方案


MongoDB 文档中,

如果聚合结果包含一个或多个基于 on 规范匹配的文档,则 $merge 可以替换输出集合中的现有文档。因此,如果聚合结果包括集合中所有现有文档的匹配文档并且您为 whenMatched 指定“替换”,则 $merge 可以替换现有集合中的所有文档。

我认为从这个角度来看,返回的聚合结果应该是可以预期的,因为它是替换中的“待定”文档。

对于您的情况,您可以首先 $lookup 整个 coll2 文档,更新eligible为 true。然后做一个 $replaceRoot 和最后的合并。

这是Mongo游乐场供您参考。


推荐阅读