MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”

Posted

技术标签:

【中文标题】MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”【英文标题】:MongoDb aggregation $match error : "Arguments must be aggregate pipeline operators" 【发布时间】:2014-12-11 13:25:52 【问题描述】:

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

我错过了什么?

【问题讨论】:

【参考方案1】:

管道阶段是数组中单独的 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 中的 Array 或 [] 括号表示法意味着它需要提供一个“列表”。这意味着一个“文档”列表,这些“文档”通常以 JSON 表示法指定,带有 大括号。

【讨论】:

谢谢。但是当我查询用户时,我只得到[]。 (当我删除 $match 的内容时,它正在工作(提供所有统计信息)。) 我刚刚从$game_user_id 中删除了$ 并且它起作用了,我永远不会理解mongodb .. 无论如何再次感谢。【参考方案2】:
 const stats = await Tour.aggregate([
 
    
        $match:  ratingsAvarage:  $gte: 4.5  
    , 
        
        $group:  
        _id: null,
        avgRating:  $avg: '$ratingsAvarage' 
                   
         
    ]

确保在数组中使用 as obj 或 分隔管道阶段。所以 $match 和 $group 必须在一个对象内。

【讨论】:

【参考方案3】:

另一个可能的原因是使用的 mongodb 版本和 mongoose 版本不兼容。

就我而言

mongodb 版本: MongoDB shell版本v3.6.18

猫鼬版: "猫鼬": "^5.1.3",

请查找兼容版本列表

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

【讨论】:

【参考方案4】:

另一个可能的原因可能是管道内的空对象 。如果您在管道中使用任何条件阶段,就会发生这种情况。

例如:

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


pipeline.push(sort)

这会导致同样的错误“Arguments must be aggregate pipeline 运营商”

相反,您可以使用以下内容:

let sort;
if(params.sort)
 sort =  $sort:  popularity: -1  

    
pipeline.concat(sort? [sort] : [])

【讨论】:

以上是关于MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 在 ObjectId 上聚合 $match

查询 $match 和 $project 重嵌套数据(MongoDB/聚合)

Mongodb 聚合管道优化 - $match 的 2 阶段

Mongodb聚合查询$match和$group

MongoDB 聚合管道 $match order

MongoDB 聚合框架匹配或