【问题标题】:How to QUERY a deeply nested json document?如何查询深度嵌套的 json 文档?
【发布时间】:2018-01-06 15:30:22
【问题描述】:

我已将一个巨大的 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 来做到这一点。

【问题讨论】:

    标签: php json mongodb nested


    【解决方案1】:

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

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

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

    $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 控制台是否有插件,所以我可以更轻松地编写这些查询(比如不同的工作区)?我听说有一个应用程序,但忘记了它的名称。
    【解决方案2】:

    这是因为您只指定了.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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多