如何查询深度嵌套的json文档?

时间:2018-01-06 15:30:23

标签: php json mongodb nested

我已经将一个巨大的json文件导入到mongoDB中。它已导入为一个完整的文档(带有一个_id)。我的json看起来像这样:

       {
  "_id": ObjectId("bas8adsfa832034821"),
  "Spele": {
    "Laiks": "2017/01/11",
    "Skatitaji": 6740,
    "Vieta": "Newlands Stadium",
    "T": [
      {
        "Uzvards": "Antamo",
        "Vards": "Dennis"
      },
      {
        "Uzvards": "Prompa",
        "Vards": "Pedro"
      }
    ],
    "Komanda": [
      {
        "Nosaukums": "Barcelona",
        "Speletaji": {
          "Speletajs": [
            {
              "Loma": "V",
              "Nr": 16,
              "Uzvards": "Sam",
              "Vards": "Sidney"
            },
            {
              "Loma": "A",
              "Nr": 17,
              "Uzvards": "Cisovsky",
              "Vards": "Marian"
            }
          ]
        }
      }
    ]
  }
}

因此,对于我尝试的每个查询,它都会返回整个文档。设置特定参数不会有所帮助:db.games.find({"Spele.Komanda.Speletaji.Speletajs.Nr" : 16})

当我希望它返回时

{ "Loma" : "V",
   "Nr" : 16,
   "Uzvards" : "Sam"
   "Vards" : ""Sidney"
}

但它会返回整个文档。也许我没有正确使用查询,或者我必须为每个嵌套文档提供_id,但我不知道如何。我可以使用mongo shell或PHP来做到这一点。

2 个答案:

答案 0 :(得分:0)

这是因为您只指定了.find({})操作的查询部分而不是投影部分。这是.find({})

的语法
db.collection.find({query}, {projection});

因此,您的查询应该类似于以下内容:

db.games.find({"Spele.Komanda.Speletaji.Speletajs.Nr":16},{"Spele.Komanda.Speletaji.Speletajs":1}); 

然而,这将比您想要的更多。要返回原先想要的内容,您需要投影操作员:https://docs.mongodb.com/manual/reference/operator/projection/

答案 1 :(得分:0)

您可以尝试以下聚合查询。

$filter内部数组和$arrayElemAt投影匹配的元素。

$map在所有Kamadas中输出所有匹配的Speletajs元素。

$arrayElemAt减少到一场比赛。对于多个匹配,请移除$arrayElemAt

db.games.aggregate([
  {"$match":{"Spele.Komanda.Speletaji.Speletajs.Nr":16}},
  {"$project":{
    "Speletaji":{
      "$arrayElemAt":[
        {"$map":{
          "input":"$Spele.Komanda",
          "in":{
            "$arrayElemAt":[
              {"$filter":{
                "input":"$$this.Speletaji.Speletajs",
                "cond":{"$eq":["$$this.Nr",16]}

              }},
            0]
          }
        }},
      0]
    }
  }}
])