在Mongodb中查询嵌套Json并获取所有结果
我在mongo db中有一个嵌套的Json文档,如下所示: /*一,*/ 现在我想做的是查询并获取那些status='true'的结果。通过谷歌搜索,我了解了如何查询嵌套文档,并提出了一个示例查询:在Mongodb中查询嵌套Json并获取所有结果,json,mongodb,Json,Mongodb,我在mongo db中有一个嵌套的Json文档,如下所示: /*一,*/ 现在我想做的是查询并获取那些status='true'的结果。通过谷歌搜索,我了解了如何查询嵌套文档,并提出了一个示例查询: db.getCollection('test').find({"info.0.status":"true"}) 但是正如您从上面的查询中所知道的,查询将只从第0个数组中获取适当的结果,如何让查询遍历数组并返回“status”:“true”。另外,我是Mong
db.getCollection('test').find({"info.0.status":"true"})
但是正如您从上面的查询中所知道的,查询将只从第0个数组中获取适当的结果,如何让查询遍历数组并返回“status”:“true”。另外,我是Mongodb的新手,请忽略任何错误。如果查询
db.getCollection('test')。查找({“info.0.status”:“true”)
它将返回为:
{
"_id" : ObjectId("5bf159cc6bf6ab0ac374f80c"),
"name" : "Jack",
"age" : "30",
"info" : {
"0" : {
"status" : "true",
"name" : "luffy"
},
"1" : {
"status" : "true",
"name" : "sanji"
},
"2" : {
"status" : "false",
"name" : "zoro"
}
}
}
/* 2 */
{
"_id" : ObjectId("5bf15f286bf6ab0ac374f8ed"),
"name" : "Mack",
"age" : "33",
"info" : {
"0" : {
"status" : "true",
"name" : "naruto"
},
"1" : {
"status" : "true",
"name" : "sakura"
},
"2" : {
"status" : "false",
"name" : "sasuke"
}
}
}
但是,如需求中所述,您需要将数据建模为:
[
{
"_id": ObjectId("5bf159cc6bf6ab0ac374f80c"),
"name": "Jack",
"age": "30",
"info": [
{
"status": "true",
"name": "luffy"
},
{
"status": "true",
"name": "sanji"
},
{
"status": "false",
"name": "zoro"
}
]
},
{
"_id": ObjectId("5bf15f286bf6ab0ac374f8ed"),
"name": "Mack",
"age": "33",
"info": [
{
"status": "true",
"name": "naruto"
},
{
"status": "true",
"name": "sakura"
},
{
"status": "false",
"name": "sasuke"
}
]
}
]
使用,它将返回预期结果:
db.collection.aggregate([
{
$project: {
items: {
$filter: {
input: "$info",
as: "info",
cond: {
$eq: [
"$$info.status",
"true"
]
}
}
}
}
}
])
样本响应:
[
{
"_id": ObjectId("5bf159cc6bf6ab0ac374f80c"),
"items": [
{
"name": "luffy",
"status": "true"
},
{
"name": "sanji",
"status": "true"
}
]
},
{
"_id": ObjectId("5bf15f286bf6ab0ac374f8ed"),
"items": [
{
"name": "naruto",
"status": "true"
},
{
"name": "sakura",
"status": "true"
}
]
}
]
你可以试试:db.getCollection('test')。find({info:{status:true}})尝试了上面的查询,它无法返回任何内容。很抱歉,它不起作用-我理解错误。但正如回答中所建议的,我觉得数据建模需要重新考虑,正如回答中所建议的那样。也使用了上述查询,但仍然没有获取任何记录。是的,但在使用$filter运算符之前,我需要正确更改结构,如何更改如上所示的数据结构?@AustinJoy,使用现有的数据模型,查询
{“info.0.status”:“true”}
将重新生成整个文档,因为其中一个嵌套对象满足查询要求。如果您只需要返回嵌套文档的一部分,建议的数据模型是解决方案之一。是的,我知道,尽管我的数据已插入上述表单中,但是否可以以某种方式进行查询,以便我可以首先重新建模数据。
[
{
"_id": ObjectId("5bf159cc6bf6ab0ac374f80c"),
"items": [
{
"name": "luffy",
"status": "true"
},
{
"name": "sanji",
"status": "true"
}
]
},
{
"_id": ObjectId("5bf15f286bf6ab0ac374f8ed"),
"items": [
{
"name": "naruto",
"status": "true"
},
{
"name": "sakura",
"status": "true"
}
]
}
]