javascript - $merge:如何在 $merge 管道之后返回合并的文档
问题描述
请帮助!,我有两个集合称为coll1
和coll2
。我想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: true
并coll2
仅从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
管道中使用吗?
解决方案
从MongoDB 文档中,
如果聚合结果包含一个或多个基于 on 规范匹配的文档,则 $merge 可以替换输出集合中的现有文档。因此,如果聚合结果包括集合中所有现有文档的匹配文档并且您为 whenMatched 指定“替换”,则 $merge 可以替换现有集合中的所有文档。
我认为从这个角度来看,返回的聚合结果应该是可以预期的,因为它是替换中的“待定”文档。
对于您的情况,您可以首先 $lookup 整个 coll2 文档,更新eligible
为 true。然后做一个 $replaceRoot 和最后的合并。
这是Mongo游乐场供您参考。
推荐阅读
- java - 在 Java 中解析字符串
- python - 如何使用 Selenium 和 Python 将文本发送到 https://mail.protonmail.com/create/new?language=en 的恢复邮件字段
- angular - 尝试创建密码确认验证器时出错(预期验证器返回 Promise 或 Observable)
- pytorch - 我有两个数据集,但标签对齐方式不同。如何对齐标签?
- vue.js - 在电脑上屏蔽节目,但在我的手机上不显示。可能是什么问题?
- c# - 如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?
- r - pdf_search 包的 normalizePath(path.expand(path)、winslash、mustWork) 错误?
- python - 使用循环遍历 Facebook get_insights 的日期
- java - Gson 写入嵌套对象
- android - 如何更改启动意图 React Native