MongoDB使用$slice投影时如何仅返回指定数组字段
问题解决方法
你的问题核心是MongoDB find() 方法的投影规则导致的:当投影中使用$slice这类运算符时,MongoDB会默认返回文档的所有字段,而普通的字段包含(如{questions:1})只会返回指定字段。要在不排除动态字段的前提下,只返回切片后的questions字段,改用聚合管道即可:
解决方案代码
db.Tests.aggregate([ // 匹配目标文档 { $match: { "key": 1 } }, // 仅投影并切片questions字段 { $project: { questions: { $slice: ["$questions", 1, 1] } } } ])
如果不需要返回默认的_id字段,修改$project阶段即可:
{ $project: { _id: 0, questions: { $slice: ["$questions", 1, 1] } } }
原理说明
聚合管道的$project阶段是白名单机制:只返回你显式指定的字段,不会自动包含其他未声明的字段,完美适配你的动态schema场景。而find()的投影在使用数组运算符时,采用的是黑名单机制——必须显式排除不需要的字段,否则会全部返回,这就是你遇到差异的原因。
内容的提问来源于stack exchange,提问作者Chique
相关产品推荐
相关产品推荐

