Lazy
Lazy

Reputation: 1837

MongoDb aggregation $match error : "Arguments must be aggregate pipeline operators"

I can get all stats of the site with aggregation but I want to it for a certain user, like $where.

All stats:

games.aggregate([{
                $group: {
                    _id: '$id',
                    game_total: { $sum: '$game_amount'}, 
                    game_total_profit: { $sum: '$game_profit'}}
                }]).exec(function ( e, d ) {

                    console.log( d )            

            })

When I try to use $match operator, I'm getting error :

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

What am I missing?

Upvotes: 29

Views: 60064

Answers (4)

Sanif SS
Sanif SS

Reputation: 652

Another possible reason could be due to an empty object {} inside the pipeline. It can happen if you are using any conditional stages in the pipeline.

eg:

const pipeline = []:
.....
.....
let sort = {}
if(params.sort){
 sort = { $sort: { popularity: -1 } }
}

pipeline.push(sort)

This will cause the same error "Arguments must be aggregate pipeline operators"

Instead you can use something like this:

let sort;
if(params.sort){
 sort = { $sort: { popularity: -1 } }
}
    
pipeline.concat(sort? [sort] : [])

Upvotes: 4

midnightgamer
midnightgamer

Reputation: 454

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

Make sure to separate the pipeline stages with as obj or {} inside the array. So $match and $group have to be inside an object.

Upvotes: 4

Vishwadeep Kapoor
Vishwadeep Kapoor

Reputation: 104

One more possible reason for this can be incompatible mongodb version and mongoose version used.

In my case

mongodb version: MongoDB shell version v3.6.18

mongoose version: "mongoose": "^5.1.3",

Please find the list of compatible version

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

Upvotes: 0

Neil Lunn
Neil Lunn

Reputation: 151200

Pipeline stages are separate BSON documents in the array:

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 )            
});

So the Array or [] bracket notation in JavaScript means it expects a "list" to be provided. This means a list of "documents" which are generally specified in JSON notation with {} braces.

Upvotes: 45

Related Questions