我已插入示例文档
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}
}}
)
我似乎得到了解决方案,但我认为可能有更好的方法。谢谢你的回复!
答案 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 } } }
]
)