javascript $merge:如何在$merge管道后返回合并文档

mwkjh3gx  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(143)

请帮帮忙!我有两个集合coll1coll2,我想在coll1字段的基础上更新coll2,并返回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}]

如果用户有高级计划,我想在coll2中设置eligible: true,并仅从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)

我无法完成此操作。我如何才能做到这一点?我可以在$merge管道中使用$function吗?

rbl8hiat

rbl8hiat1#

从MongoDB文档中,
如果聚合结果包含根据on规范匹配的一个或多个文档,则$merge可以替换输出集合中的现有文档。因此,如果聚合结果包含集合中所有现有文档的匹配文档,并且您为whenMatched指定了“replace”,则$merge可以替换现有集合中的所有文档。
我认为从这个Angular 来看,返回的聚合结果应该是预期的,因为它是替换中的“to-be”文档。
对于您的情况,您可以首先$lookup整个coll 2文档,将eligible更新为true,然后执行$replaceRoot,最后进行合并。
下面是Mongo playground,供您参考。

uelo1irk

uelo1irk2#

我刚找到答案。这是不可能的。你必须再做一次查询。
https://www.mongodb.com/community/forums/t/is-it-possible-to-merge-and-return/133337
MongoDB支持团队说:
现在还不可能。如果你只想得到结果,就在$merge阶段之前执行聚合管道中的所有阶段。但是如果你想把结果输出到另一个集合中,你就需要额外的查询。
欲了解更多详情,请查看上面的链接。

相关问题