Database mongo聚合$lookup与数组
我有一个这样的结构Database mongo聚合$lookup与数组,database,mongodb,aggregation-framework,nosql-aggregation,Database,Mongodb,Aggregation Framework,Nosql Aggregation,我有一个这样的结构 unions { // collection members { // array instanceId // some id ... } ... } 在文档中,我有ids prop(数组) 我需要从ids中查找至少有一个id的所有联合(基本上是$in) 问题是它不起作用 首先我想试试这个变体 { from: 'unions', let: { instanceIds: '$ids
unions { // collection
members { // array
instanceId // some id
...
}
...
}
在文档中,我有ids prop(数组)
我需要从ids中查找至少有一个id的所有联合(基本上是$in)
问题是它不起作用
首先我想试试这个变体
{
from: 'unions',
let: { instanceIds: '$ids' },
as: 'unions',
pipeline: [
{
$match: { 'members.instanceId': { $in: '$$instanceIds' } },
},
],
}
但是我们不能在这里使用聚合变量。为此,我们需要使用$expr
{
from: 'unions',
let: { instanceIds: '$ids' },
as: 'unions',
pipeline: [
{
$match: {
$expr: {
$in: ['$members.instanceId', '$$instanceIds']
}
},
},
],
}
但是它返回0个文档。InstanceId数组不是空的,我已经检查过了。
另外,如果我在示例中粘贴了一个不带$expr的值的数组,那么它将返回正确的值。所以最有可能的问题是我如何构建这个$lookup。使用{$ne:[{$setcrossion:['$members.instanceId','$$instanceIds']},[]}
{
from: 'unions',
let: { instanceIds: '$ids' },
as: 'unions',
pipeline: [
{
$match: {
$expr: {
cond: { $ne: [{ $setIntersection: ['$members.instanceId', '$$instanceIds'] }, []] },
},
},
},
],
}
使用{$ne:[{$setIntersection:['$members.instanceId','$$instanceId']},[]}
{
from: 'unions',
let: { instanceIds: '$ids' },
as: 'unions',
pipeline: [
{
$match: {
$expr: {
cond: { $ne: [{ $setIntersection: ['$members.instanceId', '$$instanceIds'] }, []] },
},
},
},
],
}