mongodb删除低于指定的所有日期

时间:2014-03-15 09:53:11

标签: mongodb date

我有以下数据。

{
    deviceID: 186,
    date: "2014-3-15"
}
{
    deviceID: 186,
    date: "2014-3-14"
}
{
    deviceID: 186,
    date: "2014-3-13"
}

还有一些较低的日期,例如2014-3-9 , 8 ,7 ,6等。

执行db.coll.remove({date:{$lte:"2014-3-5"}})

Mongo删除了15,14,13,但保留了一位数的日期。这可能是因为日期是字符串吗?

我不知道如何格式化日期,以便删除某个日期以下的所有日期。

应该是清理过程,删除日期低于指定日期的所有文档。

4 个答案:

答案 0 :(得分:11)

因为你要查询的日期字段是一个字符串而不是Date()。在您的mongo文档而不是自定义日期字符串中,将javascript日期对象插入日期字段。

喜欢

{ deviceID: 186,,"date": new Date(2012, 7, 14) }

当你执行删除时,请执行

db.coll.remove({date:{$lte:new Date(2012, 7, 14)}})

答案 1 :(得分:1)

这是因为您以错误的格式存储数据。你有一个字符串字符串 '15'小于字符串'5'。将开头的字符串转换为日期(阅读here如何在mongo中使用日期)。

只有你能用它来正确地比较你的日期:

db.coll.remove({
  date:{
    $lte : new Date(2012, 7, 14)
  }
})

答案 2 :(得分:0)

原因是您的日期为字符串

因此,在词汇意义上比较字符串“2014-3-5” 大于“2014-3-15”时,正在比较的是“1”小于“ 5" 。

将您的日期修改为真实的ISO日期,否则您将永远遇到此问题。

像这样批量转换,假设格式为“年”“月”“天”:

db.eval(function(){

   db.collection.find().forEach(function(doc) {
       var d = doc.date.split("-");
       var date = new Date( 
           "" + d[0] + "-" +
          ( d[1] <= 9 ) ? "0" + d[1] : d[1] + "-" +
          ( d[2] <= 9 ) ? "0" + d[2] : d[2]
       );
       db.collection.update(
           { "_id": doc._id },
           { "$set": { "date": date }
       );
   });
})

确保您在转换时获得正确的日期。

答案 3 :(得分:0)

如果你想从低于指定的日期删除MongoDB中的数据,你必须确保日期。

检查您是否输入正确格式的最简单方法是在查询中使用它之前对其进行测试。

例如,如果您想在Mongo shell中的ISODate中获取当前日期,只需输入new Date即可获得Mongo中的当前日期。

我在Mongo shell中尝试了以下内容:

new Date(2017, 11, 1)

然后返回

ISODate("2017-11-30T16:00:00Z")

这不是我想要的。

我想要的是在2017年11月1日之前删除数据。

这对我有用:

new Date("2017-11-01")

然后它返回:

ISODate("2017-11-01T00:00:00Z")

这就是我想要的。