2016-06-30 69 views
-1

在我的MongoDB數據庫中,我有一個名爲測試集,看起來像這樣用$項目運營商字段:不能包含在MongoDB中查詢

{ 
    "_id" : ObjectId("5774f2807f93c094a6691506"), 
    "name" : "jack", 
    "city" : "LA", 
    "age" : 30.0, 
    "cars" : 0 
} 

{ 
    "_id" : ObjectId("5774f2be7f93c094a6691507"), 
    "name" : "jack", 
    "city" : "LA", 
    "age" : 40.0, 
    "cars" : 0 
} 

{ 
    "_id" : ObjectId("5774f2ed7f93c094a6691508"), 
    "name" : "peter", 
    "city" : "London", 
    "age" : 35.0, 
    "cars" : 1 
} 

我已經做了查詢,其按名稱組中的人和城市,只顯示每個組的最古老的元素。此外,它只顯示至少有一輛車的傢伙。查詢看起來是這樣的:

db.getCollection('test').aggregate([ 

       { 
        "$match":{"cars":{$ne:0}} 
       }, 
       { 
        "$group": { "_id": { name: "$name", city: "$city" }, "age":{$max:"$age"}} 
       } 
       , 
       { 
        "$project":{"age":1, "name":"$_id.name", "city":"$_id.city", "cars":true} 
       } 
     ]) 

執行上面的查詢,我得到以下結果後:

{ 
    "_id" : { 
     "name" : "peter", 
     "city" : "London" 
    }, 
    "age" : 35.0, 
    "name" : "peter", 
    "city" : "London" 
} 

這是正確的,因爲彼得是擁有一輛汽車的唯一的人。問題是它不顯示「cars」字段。正如你在查詢中看到的那樣,有一個$ project操作符,並且「cars」字段被設置爲true。所以它應該被顯示。

回答

0

一個解決方案可能是在將數據分組的同時將$推送到數組中。

db.getCollection('test').aggregate([ 

       { 
        "$match":{"cars":{$ne:0}} 
       }, 
       { 
        "$group": { "_id": { name: "$name", city: "$city" }, 
             cars : {$push : "$cars"}, "age":{$max:"$age"}} 
       } 
       , 
       { 
        "$project":{"age":1, "name":"$_id.name", "city":"$_id.city", "cars":true} 
       } 
     ]) 
0

是否在分組階段添加汽車有幫助?我假設你需要數它們。

"$group": { 
    "_id": { name: "$name", city: "$city" }, 
    "age": { $max:"$age" } 
    "cars": { $sum:"$cars" } 
} 

項目階段的輸入是分組階段的輸出。在您的原始查詢中,此輸入中沒有可用的汽車字段。

0

它沒有顯示,因爲它沒有在上一個管道階段創建。要理解聚合管道如何工作,請像處理任何數據庫系統一樣處理聚合操作。

$group管道運算符類似於SQL的GROUP BY子句。在SQL中,除非我們使用任何聚合函數,否則不能使用GROUP BY

同樣的,你也必須在MongoDB中使用聚合函數。在這種情況下,要生成汽車領域,您將不得不使用運算符來返回組中的頂級文檔字段。

這種運作良好,當進入該$group管道一步的文件是有序的,因此對於前$group訂貨一個$sort管道的需求。然後,您可以將$first運算符應用到有序組以獲得最大值(這實質上是有序組中的頂層文檔及其對應的車值)。

正確的管道返回所需的字段是這樣的:

db.test.aggregate([ 
    { "$match": { "cars": { "$ne": 0 } } }, 
    { "$sort": { "name": 1, "city": 1, "age": -1 } } 
    { 
     "$group": { 
      "_id": { "name": "$name", "city": "$city" }, 
      "age": { "$first": "$age" } , 
      "cars": { "$first": "$cars" } 
     } 
    }, 
    { 
     "$project": { 
      "age": 1, 
      "cars": 1, 
      "_id": 0, 
      "name": "$_id.name", 
      "city": "$_id.city"    
     } 
    } 
]) 
+0

你應該在'$ match'表達式中使用'$ gt'。 – styvane