使用Mongoose执行MongoDB的Project查询(附示例文档)
嘿,针对你用Mongoose查询MongoDB中Project文档的需求,我来给你几种常用的投影查询写法,适配你提供的文档结构~
1. 基础字段投影(指定返回的字段)
如果你想返回文档的_id、onOpened和onSynched字段(默认_id会自动返回,除非你明确排除它),有两种简洁的实现方式:
方式一:在find()中直接指定投影参数
Project.find({}, '_id onOpened onSynched') .then(documents => { // 处理查询到的文档 console.log(documents); }) .catch(err => { // 捕获并处理错误 console.error(err); });
方式二:使用.select()链式方法
Project.find() .select('_id onOpened onSynched') .then(documents => { console.log(documents); }) .catch(err => { console.error(err); });
如果想排除某个字段(比如不需要返回文档的_id),只需要在字段名前加上-符号:
Project.find() .select('-_id onOpened onSynched') .then(documents => { console.log(documents); });
2. 投影数组内的特定子字段
如果只需要返回onOpened数组里的createdOn字段,而不需要每个数组元素自带的_id,可以精准指定子字段:
Project.find() .select('onOpened.createdOn onSynched') .then(documents => { console.log(documents); });
执行后,返回的onOpened数组每个元素只会包含createdOn属性,不会携带_id。
如果想保留数组元素的所有子字段,直接写数组字段名(比如onOpened)即可,会完整返回数组内的所有内容,和你提供的示例文档结构一致。
3. 聚合管道中的复杂投影
如果需要更灵活的投影操作(比如重命名字段、对数组做过滤处理等),可以使用Mongoose的聚合框架,借助$project阶段实现:
Project.aggregate([ { $project: { openedEvents: '$onOpened', // 将原字段onOpened重命名为openedEvents synchedEvents: '$onSynched', // 重命名onSynched为synchedEvents _id: 0 // 排除文档默认的_id字段 } } ]) .then(results => { console.log(results); }) .catch(err => { console.error(err); });
拓展:结合过滤的投影
如果你需要同时过滤数组内的元素(比如只返回onOpened中2018年1月5日及之后的事件),可以在$project中搭配$filter使用:
Project.aggregate([ { $project: { onOpened: { $filter: { input: '$onOpened', as: 'event', cond: { $gte: ['$$event.createdOn', new Date('2018-01-05T00:00:00.000Z')] } } }, onSynched: 1 // 保留onSynched字段的完整内容 } } ]) .then(results => { console.log(results); });
内容的提问来源于stack exchange,提问作者konrad




