请帮帮忙!我有两个集合coll1
和coll2
,我想在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
吗?
2条答案
按热度按时间rbl8hiat1#
从MongoDB文档中,
如果聚合结果包含根据on规范匹配的一个或多个文档,则$merge可以替换输出集合中的现有文档。因此,如果聚合结果包含集合中所有现有文档的匹配文档,并且您为whenMatched指定了“replace”,则$merge可以替换现有集合中的所有文档。
我认为从这个Angular 来看,返回的聚合结果应该是预期的,因为它是替换中的“to-be”文档。
对于您的情况,您可以首先$lookup整个coll 2文档,将
eligible
更新为true,然后执行$replaceRoot,最后进行合并。下面是Mongo playground,供您参考。
uelo1irk2#
我刚找到答案。这是不可能的。你必须再做一次查询。
https://www.mongodb.com/community/forums/t/is-it-possible-to-merge-and-return/133337
MongoDB支持团队说:
现在还不可能。如果你只想得到结果,就在$merge阶段之前执行聚合管道中的所有阶段。但是如果你想把结果输出到另一个集合中,你就需要额外的查询。
欲了解更多详情,请查看上面的链接。