2014-09-01 52 views
2

我想弄清楚,如果我可以以某種方式結合$第一和$ ifnull或$ cond在MongoDB聚合方法。 假設下列文件:

{ "_id" : 1, "item" : "box" , "code" : null } 
{ "_id" : 2, "item" : "box" , "code" : "abcde" } 
{ "_id" : 3, "item" : "box" , "code" : "abcde" } 
{ "_id" : 4, "item" : "box" , "code" : null } 

我然後運行下面的聚集方法將文檔進行分組在一起:

db.items.aggregate([{ 
    $group : { 
     _id : '$item', 
     code : { $first : '$code' } 
    } 
}]) 

我聚合的結果是:

{ "result" : [ { "_id" : "box", "code" : null } ], "ok" : 1 } 

我想知道有一種方法可以將$ first操作數與$ ifnull或$ cond結合起來,以獲得不爲空的代碼字段。所以,我的結果是這樣的:

{ "result" : [ { "_id" : "box", "code" : 'abcde' } ], "ok" : 1 } 

乾杯,

回答

3

不是在你想要的方式做到這一點沒有。你似乎在尋找一種「有條件」的方式來評估$first,而這只是不會發生。所有$ifNull可以爲您提供的是,如果該字段實際上「不存在」或以其他方式評估爲null,則返回「替代」值。

但你不想要這個,所有看來你基本上要爲簡單的「過濾器」通過$match聲明的可能結果第一:

db.items.aggregate([ 
    { "$match": { "code": { "$ne": null } } }, 
    { "$group": { 
     "_id": "$item", 
     "code": { "$first": "$code" } 
    }} 
]) 

不過說真的,你的情況,也除非你特別需要一個「排列順序」來得出結果,對於一個單獨的領域,你最好使用$max作爲運營商,即使$match階段實際上「仍然」通過排除任何實際上「不應該」成爲期望結果的一部分:

db.items.aggregate([ 
    { "$group": { 
     "_id": "$item", 
     "code": { "$max": "$code" } 
    }} 
]) 

所以$match$max$group可能是你真正想要在這種情況下。 $first操作員通常只有在需要文檔中的多個字段作爲結果時纔有意義,除非文檔在磁盤上顯示「自然」排序順序(通常我們表示的確如此),否則通常只能在$sort操作後進行操作四處走走 )。

因此,請考慮您實際想要做什麼並據此實施。

+0

使用$ max操作數爲我解決了它。聚合方法顯然認爲一個值大於null。這次真是萬分感謝。 – elynch 2014-09-01 14:05:36