MongoDB更新只删除带有时间戳字段的元素

时间:2016-01-26 13:34:37

标签: mongodb mongodb-query

我有一份看起来像这样的文件:

{
    "events": [
        {
            "timestamp": ISODate("2015-12-08T13:35:40.797Z") 
        },
        {
            "timestamp": ISODate("2015-12-08T13:36:40.753Z"),
            "type" : "StatusSetEvent" 
        },
        {
            "timestamp" : ISODate("2015-12-09T10:38:34.551Z")
        },
        {
            "status" : "in_progress",
            "timestamp" : ISODate("2016-01-15T10:49:23.037Z"),
            "type" : "StatusSetEvent"
        }
    ]
}

我想删除此文档中仅包含timestamp字段的所有事件。 我试过

db.collection.update(
  { },
  { $pull: { events:
      { $elemMatch:
          { timestamp: { $gte : new ISODate("2012-01-12T20:15:31Z") } }
      }
  }
  },
  { 
    multi: true, 
  }
)

遗憾的是没有运气:(我也尝试使用$datenew Date - 仍然无效。如果没有$elemMatch,它会移除所有不属于我想要的事件。

我想只删除第一个和第三个元素(只有timestamp字段的元素。)

2 个答案:

答案 0 :(得分:1)

如果您想确定哪些元素缺少其他字段,您可以定位查询中的错误字段。

而不是$pull查询timestamp,它应该检查元素所需的其他字段是否缺失。

db.collection.update(
  { },
  // Remove all elements that are missing a "type" field
  { $pull: { events: { type: {$exists: false } } } },
  { 
    multi: true, 
  }
)

答案 1 :(得分:-1)

根据Data Types in the mongo Shell,两者都应该是等价的:

  

mongo shell提供了各种方法来返回日期,可以是字符串,也可以是Date对象:

     
      
  • Date()方法,以字符串形式返回当前日期。
  •   
  • new Date()构造函数,它使用ISODate()包装器返回Date对象。
  •   
  • ISODate()构造函数,它使用ISODate()包装器返回Date对象。
  •   

基于此,您应该更改此行:

{ timestamp: { $gte : new ISODate("2012-01-12T20:15:31Z") } }

到此:

{ timestamp: { $gte : ISODate("2012-01-12T20:15:31Z") } }