我在Mongo DB中有以下类型的记录.
{
"_id" : ObjectId("50217d8874ebb0e4e52cc07d"),
"timestamp" : "8/7/12 1:41:36 PM Pacific Daylight Time",
"_ts" : ISODate("2012-08-07T20:41:44.119Z")
}
Run Code Online (Sandbox Code Playgroud)
如何删除旧记录?我尝试了类似的东西db.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}});,但它不起作用.
在您的原始查询中,timestamp只是一个字符串字段,Date()将在 Mongo shell 中被视为字符串。比较这些操作数将像任何其他字符串比较一样工作:
$ mongo
MongoDB shell version: 2.2.0-rc1-pre-
connecting to: test
> db.foo.drop()
true
> db.foo.insert({ x: Date() });
> db.foo.find()
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> sleep(1000)
null
> db.foo.find({ x: { $lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: { $gt: Date() }});
>
Run Code Online (Sandbox Code Playgroud)
ISODate()是Mongo date fields的 JS 等价物,并且在使用$gtor运算符时不能与字符串值进行比较$lt:
> db.foo.find({ x: { $gt: ISODate() }});
> db.foo.find({ x: { $lt: ISODate() }});
> db.foo.find({ x: { $ne: ISODate() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.insert({x: ISODate() });
> db.foo.find({ x: {$gt: Date() }});
> db.foo.find({ x: {$lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: {$ne: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
{ "_id" : ObjectId("50218fa18930273947a21cf4"), "x" : ISODate("2012-08-07T21:58:57.350Z") }
>
Run Code Online (Sandbox Code Playgroud)
Mongo 确实定义了类型之间的比较顺序,其中字符串出现在日期之前,但这与集合中同一字段可能具有不同类型时的排序顺序有关。
请注意,如果删除旧记录,如果您经常做某事(例如在批处理过程中),您可能会对TTL 集合感兴趣,这是即将发布的 2.2 版本中的新功能。Kristina Chodorow 还在这篇博客文章中就此主题撰写了有趣的介绍。
| 归档时间: |
|
| 查看次数: |
12649 次 |
| 最近记录: |