我有两个集合:项目和委员会。
// collection items
{
_id: ObjectId("5d2b9e2da676e50cb9d061fe"),
name: 'some name'
}
// collection commisions
{
_id: ObjectId("5d2cb8ad7240251917b18c03"),
items: [
{
item: ObjectId("5d2b9e2da676e50cb9d061fe")
}
]
}
现在使用聚合,我需要查找带有计数的项目(它们出现在多少个委员会中)。我正在尝试:
db.getCollection('items').aggregate([{
$match: {
_id: ObjectId("5d2b9e2da676e50cb9d061fe")
}
}, {
$lookup: {
from: 'commisions',
let: {
item: '$_id',
items: {
$map: {
input: '$items',
as: 'i',
in: '$$i.item',
}
}
},
pipeline: [{
$match: {
$expr: {
$in: ['$item', '$items']
}
}
}],
as: 'commisions'
}
},
{
$project: {
commisions: 1,
commisionsSize: { $size: '$commisions' }
}
},
{
$limit: 100
}
])
但是当我尝试运行此查询时,我得到了:
“ errmsg”:“ $ in需要一个数组作为第二个参数,发现:丢失”
问题是commision.items
不是平面数组,而是嵌套的。
答案 0 :(得分:1)
我认为您对$lookup
语法有点困惑,特别是您在let
部分中定义的变量应该属于当前集合,而不是您将要使用的集合查找。
尝试一下:
db.getCollection('items').aggregate([
{
$match: {
_id: ObjectId("5d2b9e2da676e50cb9d061fe")
}
},
{
$lookup: {
from: 'commisions',
let: {item: '$_id'},
pipeline: [
{
$match: {
$expr: {
$in: [
'$$item',
{
$map: {
input: '$items',
as: 'i',
in: '$$i.item',
}
}
]
}
}
}],
as: 'commisions'
}
},
{
$project: {
commisions: 1,
commisionsSize: {$size: '$commisions'}
}
},
{
$limit: 100
}
])