Reputation: 1837
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
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
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
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
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