MongoDB 3.2.18聚合管道用$slice报错:无法识别阶段名称
解决MongoDB聚合中
$slice报错的问题 我懂你遇到的困扰了!虽然MongoDB 3.2确实引入了在聚合管道中使用$slice的支持,但你犯了一个常见的小错误:$slice并不是一个独立的聚合管道阶段,它是一个投影操作符,必须嵌套在$project、$addFields这类负责字段处理的阶段里使用,不能直接和$match并列作为管道步骤。
你的错误写法分析
你当前的聚合管道把$slice当成了独立阶段,这就导致MongoDB无法识别这个“阶段名称”:
db.test.aggregate( [ { $match : {"keya" : val} }, {$slice : ["$mylist", 2] } // 错误:$slice不能单独作为管道阶段 ] )
正确的写法示例
示例1:用$project裁剪mylist字段
如果你只想保留裁剪后的mylist和指定的其他字段,可以用$project:
db.test.aggregate([ { $match: { "keya": val } }, { $project: { mylist: { $slice: ["$mylist", 2] }, // 在这里嵌套使用$slice _id: 1, // 显式保留_id字段(默认会保留,也可以省略) keya: 1 // 如果你需要保留keya字段,必须显式列出 } } ])
示例2:用$addFields添加裁剪后的新字段
如果你想保留所有原有字段,同时新增一个裁剪后的列表字段(比如slicedMylist),用$addFields会更方便(MongoDB 3.2及以上支持):
db.test.aggregate([ { $match: { "keya": val } }, { $addFields: { slicedMylist: { $slice: ["$mylist", 2] } // 新增裁剪后的字段 } } ])
简单来说,$slice的作用是处理字段内容,而不是作为一个独立的管道步骤,把它放到$project或$addFields里就可以正常工作啦!
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

