2015-04-30 56 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)); 
});