Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何查询深度嵌套的json文档?_Php_Json_Mongodb_Nested - Fatal编程技术网

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

Php 如何查询深度嵌套的json文档?,php,json,mongodb,nested,Php,Json,Mongodb,Nested,我已经将一个巨大的json文件导入mongoDB。它已导入为一个完整的文档(具有一个_id)。我的json如下所示: { "_id": ObjectId("bas8adsfa832034821"), "Spele": { "Laiks": "2017/01/11", "Skatitaji": 6740, "Vieta": "Newlands Stadium", "T": [ { "Uzvards": "Antamo

我已经将一个巨大的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,但我不知道如何使用。我可以使用MongoShell或PHP来完成此操作。

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

因此,您的查询应该更类似于:

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

然而,这将返回比你想要的更多。要提前返回所需的内容,需要使用投影运算符:

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

因此,您的查询应该更类似于:

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

然而,这将返回比你想要的更多。要提前返回所需的内容,您需要使用投影运算符:

您可以尝试下面的聚合查询

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

$map
输出所有Kamada中所有匹配的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]
    }
  }}
])

您可以尝试下面的聚合查询

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

$map
输出所有Kamada中所有匹配的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]
    }
  }}
])

您好,谢谢您的回复,它工作完美无瑕,现在我知道了!不过我有一个问题-mongo.exe控制台是否有一个插件,这样我可以更轻松地编写这些查询(比如不同的工作区)?我听说有一个这样的应用程序,但是忘记了它的名字。你好,谢谢你的回复,它工作完美无瑕,现在我知道怎么做了!不过我有一个问题-mongo.exe控制台是否有一个插件,这样我可以更轻松地编写这些查询(比如不同的工作区)?我听说有一份申请,但忘了它的名字。