MongoDB如何在$project阶段合并$slice切片和字段过滤,解决路径冲突报错
报错原因
报错的核心原因是同一个$project阶段不能同时对父字段(shortList)做重新计算赋值、又对该父字段的子字段(shortList._id)指定投影规则,MongoDB会判定为路径冲突,无法解析执行逻辑。
解决方案
方案1:拆分两个连续的$project阶段(最简单直观,无额外学习成本)
先执行数组切片,再执行字段排除,两个阶段分开写就不会有路径冲突,你的查询最后部分修改为:
// 第一个$project:完成shortList切片 { $project : { "shortList": { "$slice": [ "$shortList", 3 ] } } }, // 第二个$project:完成字段排除 { $project : { _id : 0, "shortList._id": 0, "shortList.listTitle": 0 } }
方案2:单$project阶段配合$map实现(减少聚合阶段,性能略优)
如果你的MongoDB版本 >= 4.2,可以用$unset简化排除逻辑,不用手动罗列需要保留的字段:
{ $project : { _id: 0, "shortList": { "$map": { "input": { "$slice": [ "$shortList", 3 ] }, "as": "item", "in": { "$unset": [ "$$item._id", "$$item.listTitle" ] } } } } }
低版本MongoDB可以手动指定shortList子项保留的字段实现同样效果:
{ $project : { _id: 0, "shortList": { "$map": { "input": { "$slice": [ "$shortList", 3 ] }, "as": "item", "in": { "chapters": "$$item.chapters", "itemTitle": "$$item.itemTitle", "totalScore": "$$item.totalScore", "count": "$$item.count", "itemComments": "$$item.itemComments" } } } } }
内容的提问来源于stack exchange,提问作者planetstarbucks
相关产品推荐
相关产品推荐

