在Mongodb中查询嵌套Json并获取所有结果

在Mongodb中查询嵌套Json并获取所有结果,json,mongodb,Json,Mongodb,我在mongo db中有一个嵌套的Json文档,如下所示: /*一,*/ 现在我想做的是查询并获取那些status='true'的结果。通过谷歌搜索,我了解了如何查询嵌套文档,并提出了一个示例查询: db.getCollection('test').find({"info.0.status":"true"}) 但是正如您从上面的查询中所知道的,查询将只从第0个数组中获取适当的结果,如何让查询遍历数组并返回“status”:“true”。另外,我是Mong

我在mongo db中有一个嵌套的Json文档,如下所示: /*一,*/

现在我想做的是查询并获取那些status='true'的结果。通过谷歌搜索,我了解了如何查询嵌套文档,并提出了一个示例查询:

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"
      }
    ]
  }
]