mongodb - 对象上的 MongoDB $setUnion ($setUnion 但带有附加信息)
问题描述
stackoverflow 社区,我不经常在 mongodb 中使用大型对象数组,所以我不知道如何解决这个问题:
1. 我在一个文件中工作,所以显然这是一个aggregate
女巫首先做了一个{$match:{"_id" : ObjectId("5c3f5cb04147b3082648278b") }},
2. 好的,现在我有另一个步骤 $project + $filter 来过滤掉一些对象,但这并不重要(我认为)
我有一个对象数组,类似于这个
{ "_id": ObjectId(".."), "data": [
{ id : 01, groupId: 22, noteId: 876543 }, { id : 02, groupId: 33, noteId: 767676 }, { id : 03, groupId: 22, noteId: 876543 }, { id : 04, groupId: 76, noteId: 876543 }
] }
但每个对象有数千个条目和更多值。
每个 groupId 可以有任何 noteId,但相同的组总是有相同的 noteId。问题:noteIds 可以在组之间共享。
我添加了这个
{ $project: {
"groupIds": {"$setUnion": "$data.groupId"}
}}
女巫给了我所有的 groupId,但我也得到了所有相关的 noteId,这一点非常重要,因为它是一个与其他任何东西无关的任意 ID。
是否可以通过指定字段以某种方式联合对象?还是有其他方法可以解决这个问题?如果我可能使用 $in($data.groupId, $setUnion('union from above') 过滤对象,我仍然不知道如何只提取我需要的 2 个字段。
提前感谢您的帮助
HM
解决方案
您可以使用以下聚合
db.collection.aggregate([
{ "$unwind": "$data" },
{ "$group": {
"_id": {
"_id": "$_id",
"groupId": "$data.groupId"
},
"noteIds": {
"$push": {
"noteId": "$data.noteId",
}
}
}},
{ "$group": {
"_id": "$_id._id",
"data": {
"$push": {
"groupId": "$_id.groupId",
"noteIds": "$noteIds"
}
}
}}
])
推荐阅读
- batch-file - 批处理脚本不显示整个输出
- python - 无法在 Win10x64 上为 Python3.7.1 安装 mmh3 - 无法识别可视化 C++ 构建工具
- c++ - 逻辑错误。std::string 中的元素未正确替换为 for 循环
- assembly - endbr64 指令实际上是做什么的?
- python - 用元组分配多个列表的元素
- php - 异常代码的严重性
- ios - CoreData:注释:无法在路径加载优化模型(Xcode 11 -> iOS 12)
- mongodb - 在聚合查询 mongodb 中对来自两个单独集合的字段使用 $match
- javascript - Node.js - Promise 回调覆盖自定义对象
- content-management-system - 链接回查询不适用于 ContentBlocksFieldPlugin