2013-01-08 65 views
23

我有兩個鍵A和B,它們在文檔中的存在是互斥的。當A存在時,我必須由A分組,當B存在時由B分組。所以我將$project中的所需值寫入一個名爲MyKey的計算鍵中,我將在其中執行$group。但它看起來像我在語法上犯了一個錯誤。我試圖在兩個方面寫$項目:

{$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}}

{$project: {MyKey: {$cond: [{"A": {$exists:true}}, "$A", "$B"]}}}

但我不斷收到錯誤:

{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...

什麼錯?

回答

19

使用$ifNull,而不是在$cond$project

{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}} 

如果A存在,且不能null它的價值將被使用;否則使用B的值。

+0

再次感謝! :-)我浪費了這麼多時間在這.. –

+0

我可以使用$ isNull和cond嗎? –

1

我在尋找類似問題時發現了您的問題,但卻忽略了一個鍵,我一直在尋找我的參數。我終於解決了這個問題。

這是我用於我的$ _id.status參數,檢查它是否存在於cond中。

$cond: [{ 
    $or: [{ 
      $ne: ["$_id.status", null] 
    }] 
}, 1, null] 

$或不需要。我一直在那裏...只是爲了好玩。我認爲它現在不會影響查詢。我將在稍後測試速度。

9

如果一個人想檢查$存在在$ COND另一種方法是使用$不 與$ COND

{$project: {MyKey: {$cond: [{$not: ["$A"]}, "$B", "$A"]}}} 

和真值表$不作爲

enter image description here

希望幫助

4

你可以模擬存在與

$ne : [$var_to_check, undefined] 

如果var被定義,則返回true