2017-01-09 72 views
1

我想要$project如果一個字段存在,但不是它的值,使用mongoosemodelmodelaggregate查詢。 如果在$cond有可能使用$exists,它看起來會是這樣的:

$project: { 
    b: { 
     $cond: { 
      if : {$exists: ['$b', true]}, 
      then : true, 
      else : false 
     } 
    } 
} 

但是,我在$cond運營商使用boolean表達。 在MongoDB的外殼,我可以做類似的事情:

{$eq: ['$b', undefined]} 

,併產生預期的結果,但由於某種原因mongoose模式aggregate,它總是與true結果。

例如,如果我有下列文件:

{ 
    "a" : 1, 
    "b" : 2 
}, 
{ 
    "a" : 1 
} 

我需要的結果如下:

{ 
    "b": true 
}, 
{ 
    "b": false 
} 

我怎麼可以做這樣的事情與mongoose

回答

1

$exists不支持aggregate查詢MongoDB。所以在aggregate查詢而不是$exists可以使用$ifNull

語法:

{ $ifNull: [ <expression>, <replacement-expression-if-null> ] } 

for more

更新時間:

得到btruefalse可以試試這個查詢

db.test.aggregate([ 
    { 
     $project: { 
      b: { 
       $cond: [ 
        {$ifNull: ['$b', false]}, // if 
        true, // then 
        false // else 
       ] 
      } 
     } 
    } 
]) 
+0

我可以(在some_field設置爲false在這種情況下,你可以內false改變的東西更適合就不會工作)的不要使用'$ ifNull',因爲我不想投影字段的值,只要它存在與否。如果'$ ifNull'返回false,它將投影該值。 – TomG

+0

實際上你的目標是什麼,你可以在你的問題部分添加一個例子來更清楚@TomG –

+0

我添加了一個例子 – TomG

0

您就可以使用兩個$project語句這種情況下,利用該$ifNull操作

[ 
{ 
     $project: { 
     test: { 
      $ifNull: [ 
       '$some_field', 
       false 
      ] 
     } 
    } 
}, 
{ 
    $project: { 
     test: { 
      $cond: { 
       if : {$eq: ['$test', false]}, 
       then : false, 
       else : true 
      } 
     } 
    } 
} 

]) 
+0

是的,這是一個選項,但我不想添加額外的'$ project'舞臺,這不是我使用的唯一字段和條件。 – TomG