2014-03-31 60 views
1

我有一个模式的例子;查询子文档中的字段

{ "_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” “_id:1234”。任何建议,非常感谢。

+0

'_id:1234'包含两辆不同'vin's的汽车。你究竟需要什么作为结果?像[3928056,8056309]'这样的数组?具体的例子总是有帮助的。 – mnemosyn

+0

是的,我假设你想要'_id'和'vin'字段,对吧? –

回答

0

如果通过查询,你的意思是可以在javascript的VINS的值,你可以阅读JSON到一个名为theString(或任何其他名称)字符串,这样做:

变种F = [ ],obj = JSON.parse(theString);

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

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

2

可以使用带有点符号的字段选择参数来约束输出只所需的字段:

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

输出:

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

或者,如果你只是想数组vin您可以使用的聚合值:

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

只是添加到这个答案,查询的投影部分('{'cars.vin':1}')带有'_id'的defualt。如果你这样做,你可以删除它:'{vin:true,_id:false}'这个投影的值只是脱离了JS的真/假值。 –

+0

对,我只是在做这个改变。 – JohnnyHK

+0

单词。我只是觉得这将是一个很好的信息,包括。 –