【问题标题】:How to retrieve just the array values only of a nested field of MongoDB document? [duplicate]如何仅检索 MongoDB 文档嵌套字段的数组值? [复制]
【发布时间】:2020-03-06 06:30:06
【问题描述】:

我正在尝试从 MongoDB 中深入查询和检索特定字段,但遗憾的是无法找出正确的解决方案。

文档数据

[ {
   "_id": 39127198,
   "name": "Mike",
   "details": {
      "age": 25,
      "vehicles":[
         {"brand":"Chevrolet","model":"Silverado","plate":"AB11"}, 
         {"brand":"Jeep","model":"Cherokee","plate":"CG678"}
      ]
   }
}, {
   "_id": 39127198,
   "name": "Taylor",
   "details": {
      "age": 25,
      "vehicles": [
          {"brand":"GMC","model":"Sierra","plate":"748397"}
      ]
   }
} ]

我的要求:为特定玩家单独返回“车辆”数组。在这种情况下,假设用户“Mike”。

这是我尝试过的

collection.find( {"name":"Mike"} )
          .project( {"details.vehicles" : 1, "_id": 0, "name": 0} )
          .toArray(function(err, result) { ... } )

collection.aggregate([
  { $match: { "name":"Mike" } },
  { $project: {"details.vehicles" : 1, "_id": 0, "name": 0} }
]).toArray(function(err, result) { ... } )

这是我从上面的代码中得到的

[
   {
     "details": {
       "vehicles": [
         {"brand":"Chevrolet","model":"Silverado","plate":"AB11"}, 
         {"brand":"Jeep","model":"Cherokee","plate":"CG678"}
       ]
     }
   }
]

预期

[
   {"brand":"Chevrolet","model":"Silverado","plate":"AB11"}, 
   {"brand":"Jeep","model":"Cherokee","plate":"CG678"}
]

我正在使用 MongoClient。 MongoDB shell 版本 v4.2.1

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    查询:

    db.vehi.aggregate( [ 
      { $match: { "name":"Mike" } },
      { $project: { "vehicles": "$details.vehicles", "_id": 0 } }
    ] ).next().vehicles
    

    准确输出:

    [
            {
                    "brand" : "Chevrolet",
                    "model" : "Silverado",
                    "plate" : "AB11"
            },
            {
                    "brand" : "Jeep",
                    "model" : "Cherokee",
                    "plate" : "CG678"
            }
    ]
    


    - 或 -

    这也得到相同的结果:

    db.vehi.find( 
      { "name" : "Mike" }, 
      { "details.vehicles" : 1, _id : 0 }
     ).next().details.vehicles
    

    【讨论】:

      【解决方案2】:

      您可以使用 $unwind 和 $replaceRoot 阶段来实现:

      db.collection.aggregate([
        {
          $match: {
            "name": "Mike"
          }
        },
        {
          $unwind: "$details.vehicles"
        },
        {
          $replaceRoot: {
            newRoot: "$details.vehicles"
          }
        }
      ])
      

      将准确输出您需要的内容。 希望对你有帮助

      【讨论】:

      • 也许添加toArray() 以获得确切要求的输出
      • 太棒了,谢谢。它奏效了。
      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2020-09-22
      • 2017-06-17
      相关资源
      最近更新 更多