目前,无法在$in数组聚合运算符中使用$filter运算符。
假设这是文档架构:
{
_id: 1,
users: [
{
_id: 'a',
accounts: ['x', 'y', 'z']
},
{
_id: 'b',
accounts: ['j','k','l']
}
]
}
我希望使用aggregate
根据users
数组的内容获取包含accounts
过滤数组的文档。
IF $in
适用于$filter
运算符,我希望它看起来像这样:
db.test.aggregate([
{
$project: {
'filtered_users': {
$filter: {
input: '$users',
as: 'user',
cond: {
$in: ['$$user.accounts', ['x']]
}
}
}
}
}
])
并返回filtered_users
仅第一位用户,因为 x 他的帐户。
但是,正如我所说,这不起作用,我得到了错误:
“无效的运算符'$ in'”
因为$filter
运算符不支持。
现在我知道我可以使用$unwind
并使用常规$match
运算符来执行此操作,但随后需要使用$group
来设置它会更长(并且更加丑陋)结果以数组形式返回 - 我不想要这个
我的问题是,如果有其他方法来操纵$filter
运算符以获得我想要的结果。
答案 0 :(得分:15)
由于数组的聚合操作不支持$in
,因此您可以使用$setIsSubset
。有关详细信息,请参阅this链接。聚合查询现在看起来像
db.test.aggregate([
{
$project: {
'filtered_users': {
$filter: {
input: '$users',
as: 'user',
cond: {
$setIsSubset: [['x'], '$$user.accounts']
}
}
}
}
}])
此查询将仅返回[x]
中user.accounts
作为数组子集的元素。
答案 1 :(得分:10)