首页 > 解决方案 > mongodb:从日期之前的嵌套数组中提取元素

问题描述

我有一个被认为如此简单的问题。给定具有 expires 字段的嵌套文档。一个示例文档:

{
   _id: ObjectId(),
   stuff: [
     {
        name: 'egg',
        expires: ISODate("2019-07-19T12:52:56.163Z")
     },
     {
        name: 'potato',
        expires: ISODate("2019-07-19T12:52:56.163Z")
     }
   ]
}

我想我可以使用这样的查询:

db.collection.update({"_id": ObjectId("578411d30af77c226c52b940")}, { 
  "$pull": { 
    "stuff.expires": { "$lt": ISODate() } 
  } 
});

可能能够一次将其应用于多个文档,但即使在尝试更新单个文档时,我也会遇到该错误:

不能使用(stuff.expires)的部分(expires)来遍历元素

我尝试了很多修改,但我无法找到一种方法来完成这项工作或类似的例子(在搜索 mongodb 的东西时这似乎很奇怪)。

如果无法一次更新多个文档,如果有办法在原子查询中从单个文档中删除所有过期项目,我会很高兴。该查询不需要与旧的 mongodb 版本一起使用 - 最新版本很好。

标签: mongodbmongodb-query

解决方案


我认为您可以使用此查询来实现您想要的:

db.collection.update({}, {
    $pull: {
        stuff: {
            expires: {
                $lt: ISODate()
            }
        }
    }
}, {
    multi: true
})

上面的查询将针对所有文档,并将拉出每个stuff过期属性低于您ISODate() 的对象multi:true是允许更新多个文档的选项


推荐阅读