我可以使用aggregation
获取该网站的所有统计信息,但我希望将其用于特定用户,例如$where
。
所有统计数据:
games.aggregate([{
$group: {
_id: '$id',
game_total: { $sum: '$game_amount'},
game_total_profit: { $sum: '$game_profit'}}
}]).exec(function ( e, d ) {
console.log( d )
})
当我尝试使用$match
运算符时,我收到错误:
games.aggregate([{
$match: { '$game_user_id' : '12345789' },
$group: {
_id: '$id',
game_total: { $sum: '$game_amount'},
game_total_profit: { $sum: '$game_profit'}}
}]).exec(function ( e, d ) {
console.log( d )
})
Arguments must be aggregate pipeline operators
我错过了什么?
答案 0 :(得分:20)
管道阶段是数组中单独的BSON文档:
games.aggregate([
{ $match: { 'game_user_id' : '12345789' } },
{ $group: {
_id: '$id',
game_total: { $sum: '$game_amount'},
game_total_profit: { $sum: '$game_profit'}}
}}
]).exec(function ( e, d ) {
console.log( d )
});
因此,JavaScript中的数组或[]
括号表示法意味着它需要提供“列表”。这意味着“文档”列表,通常用带有{}
大括号的JSON表示法指定。
答案 1 :(得分:0)
另一个可能的原因可能是所使用的mongodb版本和mongoose版本不兼容。
就我而言
mongodb版本 : MongoDB Shell版本v3.6.18
猫鼬版本 : “猫鼬”:“ ^ 5.1.3”,
请找到兼容版本的列表
答案 2 :(得分:0)
const stats = await Tour.aggregate([
{
$match: { ratingsAvarage: { $gte: 4.5 } }
},
{
$group: {
_id: null,
avgRating: { $avg: '$ratingsAvarage' }
}
}]
确保在数组内使用obj或{}分隔管道阶段。因此,$ match和$ group必须位于对象内部。