用猫鼬过滤嵌入式子文档数组

时间:2019-09-01 15:54:10

标签: mongoose subdocument

我的主要模式是一个事件,其中一些步骤嵌入到数组中。我想查询事件,并过滤步骤,并满足一定条件。因此,返回的事件并不具有其所具有的所有步骤,而仅是符合条件的那些步骤。 我可以使用聚合来完成此操作,但是我需要以猫鼬文档形式返回的文档,因此我可以在每个文档上使用save()函数,因此只能使用我认为的猫鼬来完成。

事件示例:

{
  "_id" : ObjectId("5d57b6ad754e9d1ec0c123e6"),
  "title" : "wedding",
  "user" : ObjectId("5d4fedfd63dc55207cf128ff"),
  "date" : ISODate("2019-09-24T20:00:00.000Z"),
  "steps" : [
  {
    "_id" : ObjectId("5d57b6ad754e9d1ec0c123e7"),
    "title" : "home",
    "startDate" : ISODate("2019-06-27T20:00:00.000Z"),
    "endDate" : ISODate("2019-07-21T20:00:00.000Z"),
    "isDone" : false,
    "state" : 2
  },
  {
    "_id" : ObjectId("5d57b6ad754e9d1ec0c123e8"),
    "title" : "guests",
    "startDate" : ISODate("2019-07-07T20:00:00.000Z"),
    "endDate" : ISODate("2019-07-30T20:00:00.000Z"),
    "isDone" : false,
    "state" : 2
  },
  {
    "_id" : ObjectId("5d57b6ad754e9d1ec0c123e9"),
    "title" : "car",
    "startDate" : ISODate("2019-07-11T20:00:00.000Z"),
    "endDate" : ISODate("2019-07-20T20:00:00.000Z"),
    "isDone" : false,
    "state" : 2
  }
]
};

到目前为止的汇总:

const now = new Date();
Event.aggregate([
    {
      $match: { date: { $gte: now } },
    },
    {
      $unwind: '$steps',
    },
    {
      $match: { 'steps.startDate': { $lte: now }, 'steps.endDate': { $gte: now }, 'steps.state': { $ne: 1 } },
    },
  ])

我已经搜索过文档,但没有找到任何内容。

1 个答案:

答案 0 :(得分:0)

对于基于批注的更新子文档,无论是在主文档还是在子文档中:

  var now = new Date()
  Events.find({
       date: { $gte: now }, 'steps.startDate': { $lte: now }, 'steps.endDate': { $gte: now }, 'steps.state': { $ne: 1 } 
    },
    (err, events) => {
        events.forEach(event => {
            var steps = event.steps.filter(step => (step.startDate < now && step.endDate > now && step.state != 1));
            steps.forEach(step => {step.state = 1;})
            event.save((err, event_)=>{console.log('event updated: ', event_)})
        })
    }
  )

我在其中测试过的完整示例项目(它不存在): https://codepen.io/ya3ya6/pen/xxKLNNG?editors=0010

(帮助:您应该两次运行此代码,第一次将init设置为true,以创建一些示例数据。第二次,将init设置为false以运行实际的查询。您可以在mongodb中检查数据库数据以验证结果。)