2015-04-30 53 views
0

如果我在MongoDB中有一个数据,如下所示2个文档,每个文档都有传感器的子文档。我怎样才能得到node1d在MongoDB中是1的传感器的列表?如何在MongoDB中查找子文档中的元素

{ 
    "name": "Site 1", 
    "sensors": [ 
    { "nodeId": 1, "value": "23" }, 
    { "nodeId": 1, "value": "34" }, 
    { "nodeId": 2, "value": "66" } 
    ] 
} 

{ 
    "name": "Site 2", 
    "sensors": [ 
    { "nodeId": 2, "value": "78" }, 
    { "nodeId": 2, "value": "99" }, 
    { "nodeId": 2, "value": "11" }, 
    { "nodeId": 1, "value": "45" } 
    ] 
} 

期望输出

{ 
    "sensors": [ 
    { "nodeId": 1, "value": "23" }, 
    { "nodeId": 1, "value": "34" }, 
    { "nodeId": 1, "value": "45" } 
    ] 
} 

回答

0

如果你在项目中使用$运营商如下:

db.collectionName.find({"sensors":{"$elemMatch":{"nodeId":1}}},{"sensors.$":1}).pretty() 

它仅返回第一匹配因为$操作者

的以下限制的数组值由于只有一个阵列字段可以出现在查询文档中,如果阵列包含文档,来指定这些文件的多个字段的标准,使用$ elemMatch操作符。

如果$aggregation那么你得到预期的结果,蒙戈聚集查询如下:

db.collectionName.aggregate({ 
    "$unwind": "$sensors" // first unwind all sensors array 
}, { 
    "$match": { 
    "sensors.nodeId": 1 //macth your criteria 
    } 
}, { 
    "$group": { 
    "_id": "$sensors.nodeId", // group matchinng criteria 
    "sensors": { 
     "$push": "$sensors" 
    } 
    } 
}, { 
    "$project": { 
    "_id": 0, 
    "sensors": "$sensors" 
    } 
}).pretty() 
0

只要你有一个传感器架构和模型(如果你使用的猫鼬):

sensors.find({sensors : {'$ne': null }}, function(err, docs){ 
       if(err) 
        console.log(err); 
       else 
        res.end(JSON.stringify({sensors : docs}, null, 3)); 
});