我有一份看起来像这样的文件:
{
"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,
}
)
遗憾的是没有运气:(我也尝试使用$date
,new Date
- 仍然无效。如果没有$elemMatch
,它会移除所有不属于我想要的事件。
我想只删除第一个和第三个元素(只有timestamp
字段的元素。)
答案 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") } }