使用$ filter中的投影的mongodb

时间:2016-01-09 06:56:29

标签: mongodb mongodb-query

我已插入示例文档

db.test.insert({
    x:1, 
    a:[
        {b:1,c:1,d:1},
        {b:2,c:2}
      ]
})

当我尝试使用$ fitler聚合时,我遇到了2个问题,如下面的查询

db.test.aggregate(
{$project:{ 
  a:{$filter:{
    input : '$a',
    as : 'item',
    cond : '$$item.d'
  }}
}}
)

元素存在

1]如何测试元素广告的存在,我发现了一种仅使用 cond:' $$ item.d' 的方法,但我认为应该有更好的方法。

选择性投影

2]如何有选择地投影 b和d节点。 我尝试了下面的代码并且它可以工作,但我认为投影中也有一个管道。因此,我在同一节点1上应用了两次投影,用于过滤数组元素,2次用于数组元素节点

db.test.aggregate(
{$project:{ 
  a:{$filter:{
    input : '$a',
    as : 'item',
    cond : '$$item.d'
  }},
  a:{b:1, d:1}
}}
)

我似乎得到了解决方案,但我认为可能有更好的方法。谢谢你的回复!

1 个答案:

答案 0 :(得分:4)

(1)在我看来,$ exists运算符在聚合管道中尚不可用。您可能希望检查是否有jira请求此项,如果有,请观看并投票,如果没有,请添加一个?

我认为,您的解决方法只会返回item.d为true的情况,而不是存在的情况。因此,如果item.d == null,false,0,则不会返回。我建议尝试这样做:

cond : { $gte : [ '$$item.d', null ] }

(2)我并非100%确定我理解这个问题,但如果我这样做,我认为这样做的方法是让两个$ project进入管道。所以像这样:

db.test.aggregate( 
 [ { $project:
     {a:{$filter:{input:'$a',as:'item',cond:{$gte:['$$item.d',null]}}}}
   },
   { $project: { a : { b : 1, d : 1 } } }
 ]
)