查询子文档中的字段

时间:2014-03-31 18:20:45

标签: mongodb

我拥有的架构示例;

{ "_id" : 1234,
  “dealershipName”: “Eric’s Mongo Cars”,
  “cars”: [
         {“year”: 2013,
           “make”: “10gen”,
           “model”: “MongoCar”,
           “vin”: 3928056,
           “mechanicNotes”: “Runs great!”},
         {“year”: 1985,
          “make”: “DeLorean”,
          “model”: “DMC-12”,
          “vin”: 8056309,
          “mechanicNotes”: “Great Scott!”}
         ]
  }

我希望只查询并返回值" vin" in" _id:1234"。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用带点符号的字段选择参数将输出约束到所需的字段:

db.test.find({_id: 1234}, {_id: 0, 'cars.vin': 1})

输出:

{
    "cars" : [ 
        {
            "vin" : 3928056
        }, 
        {
            "vin" : 8056309
        }
    ]
}

或者如果您只想要一组vin值,可以使用aggregate:

db.test.aggregate([
    // Find the matching doc
    {$match: {_id: 1234}},
    // Duplicate it, once per cars element
    {$unwind: '$cars'},
    // Group it back together, adding each cars.vin value as an element of a vin array
    {$group: {_id: '$_id', vin: {$push: '$cars.vin'}}},
    // Only include the vin field in the output
    {$project: {_id: 0, vin: 1}}
])

输出:

{
    "result" : [ 
        {
            "vin" : [ 
                3928056, 
                8056309
            ]
        }
    ],
    "ok" : 1
}

答案 1 :(得分:0)

如果通过查询,你的意思是在javascript中获取vins的值,你可以将json读入一个名为theString(或任何其他名称)的字符串中并执行以下操作:

  

var f = [],obj = JSON.parse(theString);

     

obj.cars.forEach(function(item){f.push(item.vin)});

如果上面的json是较大集合的一部分,那么你需要一个外循环。