You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Mongoose执行MongoDB的Project查询(附示例文档)

嘿,针对你用Mongoose查询MongoDB中Project文档的需求,我来给你几种常用的投影查询写法,适配你提供的文档结构~

1. 基础字段投影(指定返回的字段)

如果你想返回文档的_idonOpenedonSynched字段(默认_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

火山引擎 最新活动