查找最近n天内的所有文件

时间:2013-03-22 14:18:59

标签: mongodb

我的每日集合包含以下文档:

..
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "ED", "san" : 7046.25, "izm" : 1243.96 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "UA", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "PAL", "san" : 0, "izm" : 169.9 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "PAL", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "CTA_TR", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-04T00:00:00Z"), "vid" : "CAD", "san" : 0, "izm" : 169.9 }
{ "date" : ISODate("2013-01-04T00:00:00Z"), "vid" : "INT", "san" : 0, "izm" : 169.9 }
...

我离开了 _id 字段以节省空间。 我的任务是“在过去15天内获取所有文档”。如你所见,我需要以某种方式:

  1. 获取15个独特日期。最新的文档应该作为集合中的最新文档(我的意思是它不是今天的日期,它只是基于日期字段的集合中的最新文档),也是最早的文档。好吧,也许没有必要严格定义查询中最老的一天,如果你知道我的意思,我需要的是从最近一天开始的某种top15。喜欢15 独特的天。
  2. db.daily.find()所有文件,在15天的范围内有日期字段。
  3. 因此,结果,我应该从最新的收集开始15天内看到所有文件。

    我该怎么做?

    谢谢

2 个答案:

答案 0 :(得分:43)

我刚刚针对您的数据示例测试了以下查询,并且它运行良好:

db.datecol.find(
{
    "date": 
    {
        $gte: new Date((new Date().getTime() - (15 * 24 * 60 * 60 * 1000)))
    }
}
).sort({ "date": -1 })

答案 1 :(得分:0)

您需要运行distinct命令才能获得所有唯一日期。以下是示例。 “values”数组包含集合的所有唯一日期,您需要从客户端检索最近15天

db.runCommand ( { distinct: 'datecol', key: 'date' } )
{
    "values" : [
       ISODate("2013-01-03T00:00:00Z"),
       ISODate("2013-01-04T00:00:00Z")
    ],
    "stats" : {
       "n" : 2,
       "nscanned" : 2,
       "nscannedObjects" : 2,
       "timems" : 0,
       "cursor" : "BasicCursor"
    },
    "ok" : 1
}

然后使用$in运算符,其中包含步骤1中最近的15个日期。以下是查找属于上述两个日期之一的所有文档的示例。

db.datecol.find({
  "date":{
     "$in":[
        new ISODate("2013-01-03T00:00:00Z"), 
        new ISODate("2013-01-04T00:00:00Z")
      ]
  }
})