2017-01-09 71 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