我有一个mongodb / mongoskin聚合请求,如下所示:
db.collection(customerTable + '_earnedinfluencers').aggregate([
{
$group: {
_id: '$user',
name: '', // to be filled separately
username: '', // to be filled separately
picture: '', // to be filled separately
city: '', // to be filled separately
kids: { $sum: '$kids' },
revenue: { $sum: '$dayIncome' },
kidsRevRatio: { $divide: [ { $sum: '$kids' }, { $sum: '$dayIncome' } ] }
},
$match: {
richness: { $gte: variable1 },
kids: { $lt: variable2 },
hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
event: { $in: schoolfestival },
event: { $ne: 0 }
},
$project: {
_id: 0,
user: '$_id',
name: 1,
username: 1,
picture: 1,
city: 1,
kids: 1,
revenue: 1,
kidsRevRatio: 1
}
}
], function(err, result) {
// do something with err and result
});
上面的代码给出以下错误:
Error: {"name":"MongoError","errmsg":"exception: A pipeline stage specification object must contain exactly one field.","code":16435,"ok":0}
我一般是mongo和db的新手,无法分辨我做错了什么。
您的管道参数不平衡,每个阶段都是一个单独的文档,因此您需要包装每个文件。但是还有其他一些问题
db.collection(customerTable + '_earnedinfluencers').aggregate([
{ $match: {
richness: { $gte: variable1 },
kids: { $lt: variable2 },
hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
event: { $in: schoolfestival },
}},
{ $group: {
_id: '$user',
name: { '$first': '$name' },
username: { '$first': '$username' },
picture: { '$first': '$picture' },
city: { '$first': '$city' }
kids: { '$sum': '$kids' },
revenue: { '$sum': '$dayIncome' },
kidsSum: { '$sum': '$kids' },
}},
{ $project: {
_id: 0,
user: '$_id',
name: 1,
username: 1,
picture: 1,
city: 1,
revenue: 1,
kidsSum: 1,
kidsRevRatio: { $divide: [ '$kidsSum', '$revenue' ] }
}}
], function(err, result) {
// do something with err and result
});
您将整个管道作为一个文档,实际上它需要一系列文档,如图所示。
但是,实际上您要$match
首先筛选出结果。如果您确实要在组之后进行一些其他匹配,则可以在之后将其他匹配添加到管道中。
该$group
操作要求_id
分组键之外的所有字段都需要一个“分组运算符”,除非它们是_id
您所在的分组的一部分,否则您不能仅仅将它们自己取回。通常,您需要一个运算符,例如,$first
或者完全省略它们。
仅顶级分组运算符,因此类似$divide
的操作不是分组运算符。为了在处理一个或多个$sum
结果时执行此类操作,请$project
使用具有计算值的字段将其移至稍后。
此外,诸如项目和组之类的操作也会从管道中“删除”字段,并且仅保留您明确包括的字段。因此,您不能指定不存在的字段。这就是为什么$match
首先使用索引以及可以使用索引的原因之一,而且只有在管道开始时才能这样做。
但是,对于每个阶段,唯一存在的领域就是所提到的领域。作为进一步的优化,“优化器”从一开始就将不包括文档中未特别提及的任何字段。因此,只有剩下的第一阶段比赛和小组比赛中引用的那些才会被包括在内,然后可能再次过滤掉。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句