我正在对集合
运行聚合
并使用对另一个子集合
的查找。
每个子级可能有也可能没有包含字符串
的字段(foo
)。
如果这些字段
中至少有1个对任何子子文档
具有字符串
,我将项目
一个布尔
。
这样我就可以
db.Parent.aggregate([
{
'$lookup': {
'from': 'Children',
'localField': '_id',
'foreignField': 'parentId',
'as': 'CHILDREN'
}
}, {
childHasFoo: {
"$CHILDREN" : {$elemMatch: {foo: {$ne: ''}}}
}
}
]
您可以看到我对childhasfoo
的投影。我想我可以使用$ElemMatch
或$AnyElementTrue
。请记住,foo
也可能不存在于/所有子子文档
上。因此需要考虑到这一点。
谢谢!
$MAP
数组运算符迭代子
数组的循环,$ne
检查条件,这将返回布尔值$AnyElementTrue
要检查的元素是否为true {
$addFields: {
childHasFoo: {
$anyElementTrue: {
$map: {
input: "$CHILDREN",
in: { $ne: ["$$this.foo", ""] }
}
}
}
}
}
第二种选择是更精确的条件,
$trim
删除字符串中的空白$not
和$in
要检查的字符串是否为空“”或null
然后为false,否则为true {
$addFields: {
childHasFoo: {
$anyElementTrue: {
$map: {
input: "$CHILDREN",
in: {
$not: {
$in: [
{ $trim: { input: "$$this.foo" } },
["", null]
]
}
}
}
}
}
}
}