我有2个集合。我想在匹配ID的集合上进行汇总。从那里,我想从集合b查找,其中收集A(本地字段(的匹配ID位于集合B(外域(的数组中。
基本上:
集合A:
{
_id: ObjectId('<id>')
},
{
_id: ObjectId('<id>')
},
{
_id: ObjectId('<id>')
}
集合B:
{
_id: ObjectId('<id>'),
related: ['<id>', '<id>', '<id>', '<id>']
},
{
_id: ObjectId('<id>'),
related: ['<id>', '<id>', '<id>', '<id>']
},
{
_id: ObjectId('<id>'),
related: ['<id>', '<id>', '<id>', '<id>']
}
查询:
db.collection_a.aggregate({
[$match: {_id: ObjectId('<id>')}],
// other $lookups...
[
$lookup: {
as: 'collection_b',
from: 'collection_b',
let: {id: '$_id'},
pipeline: [
{
$match: {
$expr: {$in: ['$related', '$$id']}
}
}
// sorts, projections, etc...
]
}
]
// sorts, projections, etc...
});
所需结果:
[
{
_id: ObjectId('<id>'),
collection_b: [
{
_id: ObjectId('<id>'),
related: ['<id>', '<id>', '<id>', '<id>']
},
{
_id: ObjectId('<id>'),
related: ['<id>', '<id>', '<id>', '<id>']
}
]
},
]
结果:
$in requires an array as a second argument, found: objectId
现在,我知道可以将其切换并查找A上的集合A在集合B上是可能的,但是,在这种情况下,这不是一个选项(即使收集A在集合b(。最好将其保存到一个查询。
任何帮助都非常感谢。
您可以尝试一下:
db.collection_a.aggregate(
[{ $match: { _id: ObjectId(' ') } },
// other $lookups...
{
$lookup: {
as: 'collection_b',
from: 'collection_b',
let: { id: { $toString: '$_id' } },
pipeline: [
{
$addFields: {
"related": {
"$cond": {
"if": {
"$ne": [{ "$type": "$related" }, "array"]
},
"then": [],
"else": "$related"
}
}
}
},
{
$match: {
$expr: { $in: ['$$id', '$related'] }
}
}
// sorts, projections, etc...
]
}
}
// sorts, projections, etc...
]);
所说的$in
将数组作为第二个参数,而您要搜索的值是第一个参数。