MongoDb聚合$匹配错误:"参数必须是聚合管道运算符"

时间:2014-10-16 08:47:23

标签: javascript node.js mongodb mongodb-query aggregation-framework

我可以使用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

我错过了什么?

3 个答案:

答案 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”,

请找到兼容版本的列表

https://mongoosejs.com/docs/compatibility.html

答案 2 :(得分:0)

 const stats = await Tour.aggregate([
 
    {
        $match: { ratingsAvarage: { $gte: 4.5 } }
    }, 
    {    
        $group: { 
        _id: null,
        avgRating: { $avg: '$ratingsAvarage' }
                   
         }
    }]

确保在数组内使用obj或{}分隔管道阶段。因此,$ match和$ group必须位于对象内部。

相关问题