MongoDB提取findOne返回子文档_id为字符串数组的两种实现方案
非聚合实现方案
方案1:直接使用find表达式投影(推荐,无需二次处理)
仅MongoDB 4.4及以上版本支持,直接在findOne()的投影参数中使用$map表达式处理数组字段即可,查询直接返回预期结构:
db.yourCollection.findOne( { /* 此处填写你的查询过滤条件 */ }, { _id: 1, title: 1, questions: { $map: { input: "$questions", as: "questionItem", in: "$$questionItem._id" } } } )
方案2:应用层转换(兼容所有版本)
如果使用的MongoDB版本较低不支持find表达式投影,拿到查询结果后在业务代码中做一次简单的数组转换即可,以JavaScript为例:
const result = await db.yourCollection.findOne({ /* 你的查询条件 */ }) // 直接转换questions字段 result.questions = result.questions.map(item => item._id)
聚合框架优雅实现方案
无需使用$group+$push的复杂写法,直接通过$set阶段覆盖原字段即可,写法简洁执行效率更高:
db.yourCollection.aggregate([ // 匹配目标文档,和findOne的过滤条件一致 { $match: { /* 你的查询条件 */ } }, // 直接覆盖questions字段,其他字段保留不变 { $set: { questions: { $map: { input: "$questions", as: "questionItem", in: "$$questionItem._id" } } } }, // 对应findOne仅返回单条结果 { $limit: 1 } ])
内容的提问来源于stack exchange,提问作者crivella
相关产品推荐
相关产品推荐

