2015-06-23 51 views
3

我試圖創建一個MongoDB的聚合函數中的投影,看到以下內容:如何訪問MongoDB投影聚合中的特定數組項目?

[ 
    {$match : {"geo" : {$ne: null}}}, 
    {$project : {"id" : "$id_str", lat: "$geo.coordinates.0", lon: "$geo.coordinates.1"}} 
] 

但是當我這樣做不越過數組項它只是突出的空數組屬性LAT和lon。

這裏需要什麼?我查看了文檔,但無法弄清楚,甚至嘗試了$ unwind和$ group的排列,但沒有成功。

回答

3

該功能將幫助您實現此功能尚不可用。但是,會有一個新的聚合運算符爲給定的索引提供數組元素。新的表達式稱爲$arrayElemAt

使用新的聚合運算符的可用MongoDB的版本3.2.X和更高,這將返回給定索引的數組元素。新的表達被稱爲$arrayElemAt。它有兩個參數,一個數組和一個索引,並返回數組中給定索引處的元素。負數索引被接受爲數組後部的索引。如果索引超出範圍時,它返回缺失值,這意味着該字段將不會在輸出存在:

var pipeline = [  
    { $match : {"geo" : {$ne: null}}}, 
    { 
     $project: { 
      _id: "$id_str", 
      lat: { $arrayElemAt: ['$geo.coordinates', 0] }, 
      lon: { $arrayElemAt: ['$geo.coordinates', 1] } 
     } 
    } 
]; 

作爲一種變通方法爲現在(假設座標陣列將總是具有在任何給定時間兩個要素),你可以試試下面的聚集管道將採取$first$last組蓄電池運營商的優勢後$sort獲得的元素:

var pipeline = [ 
    {$match : {"geo" : {$ne: null}}}, 
    { "$unwind": "$geo.coordinates" }, 
    { "$sort": {"geo.coordinates": 1} } , 
    { 
     "$group": { 
      "_id": "$_id", 
      "lat": { "$first": "$geo.coordinates" }, 
      "lon": { "$last": "$geo.coordinates" } 
     } 
    } 
];