mongodb - Mongodb:如何查询嵌套文档和顶级文档
问题描述
我有以下文件。请注意,顶级文档ID
与attribute1
.subDocument
{
"ID": "1",
"attribute1": "123",
"subDocument": [
{
"ID": "2",
"attribute1": "456",
},
{
"ID": "3",
"attribute1": "567",
}
]
},
{
"ID": "4",
"attribute1": "123",
"subDocument": [
{
"ID": "5",
"attribute1": "456",
}
]
}
现在我需要一个可以基于ID
and进行搜索的查询attribute1
。如果我给ID
=1,attribute1
=“123”,它应该返回第一个顶级文档,如下所示:
{
"ID": "1",
"attribute1": "123"
}
如果我给ID
=2,attribute1
=“456”,它应该返回子文档的项目,如下所示:
{
"ID": "2",
"attribute1": "456",
}
我怎样才能做到这一点? 操场
解决方案
询问
- 将根的 id/attribute 添加为子文档
- 展开和替换
ROOT
=> 每个成员都成为 ROOT 文档 $match
将文档与变量匹配
aggregate(
[{"$project":
{"subDocument":
{"$concatArrays":
["$subDocument", [{"ID": "$ID", "attribute1": "$attribute1"}]]}}},
{"$unwind": {"path": "$subDocument"}},
{"$replaceRoot": {"newRoot": "$subDocument"}},
{"$match" : {"ID" : your_id_var , "attribute1" : your_attr_var}}])
编辑
如果您有太多字段无法手动输入,您可以使用它,它将除"_id"
and之外的所有字段作为子文档"subDocument"
aggregate(
[{"$project":
{"subDocument":
{"$concatArrays":
["$subDocument",
[{"$arrayToObject":
{"$filter":
{"input": {"$objectToArray": "$$ROOT"},
"cond":
{"$and":
[{"$ne": ["$$this.k", "subDocument"]},
{"$ne": ["$$this.k", "_id"]}]}}}}]]}}},
{"$unwind": {"path": "$subDocument"}},
{"$replaceRoot": {"newRoot": "$subDocument"}}
{"$match" : {"ID" : your_id_var , "attribute1" : your_attr_var}}])
我们没有像remove(object,k)
这样的运算符,这使得对象到数组、过滤器和返回对象(及其复杂)。
还有另一种解决方案,但也很复杂。
推荐阅读
- c# - 如何阻止两个对象在彼此之上生成?
- sql - 数学和 to_char
- python - 向现有行添加值 -DataFrame
- macos - 提高 CGContextDrawImage 性能
- javascript - 当该元素被垃圾收集时,分配给“无引用”DOM元素的事件侦听器会发生什么?
- azure - 有谁知道如何计算 Windows Azure 预留实例的软件成本?
- javascript - 如何在同一任务中编译 SASS 和缩小 CSS 并使用 gulp 4 创建其地图
- bootstrap-4 - bootstrap 4 scss 主题颜色覆盖
- apache-zookeeper - 在storm.yaml中更改storm zookeeper服务器
- java - 了解从数组列表中删除项目背后的逻辑