28

我的daily收藏有如下文件:

..
{ "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 天范围内。

结果,我应该在 15 天内看到所有文档,从最新的集合开始。

4

3 回答 3

74

我刚刚针对您的数据样本测试了以下查询,它运行良好:

db.datecol.find(
{
    "date": 
    {
        $gte: new Date((new Date().getTime() - (15 * 24 * 60 * 60 * 1000)))
    }
}
).sort({ "date": -1 })
于 2013-04-22T01:33:40.033 回答
2

从 开始Mongo 5,这对操作员来说是一个很好的用例$dateSubtract

// { date: ISODate("2021-12-05") }
// { date: ISODate("2021-12-02") }
// { date: ISODate("2021-12-02") }
// { date: ISODate("2021-11-28") } <= older than 5 days
db.collection.aggregate([
  { $match: {
    $expr: {
      $gt: [
        "$date",
        { $dateSubtract: { startDate: "$$NOW", unit: "day", amount: 5 } }
      ]
    }
  }}
])
// { date: ISODate("2021-12-05") }
// { date: ISODate("2021-12-02") }
// { date: ISODate("2021-12-02") }

使用$dateSubtract,我们通过从当前日期( ) 中减去5( amount) "days"( ) 来创建保存文档的最旧日期。unit$$NOWstartDate

您显然可以添加一个$sort按日期对文档进行排序的阶段。

于 2021-12-05T11:12:39.230 回答
0

您需要运行distinct命令来获取所有唯一日期。下面是示例。“值”数组包含您需要从中检索客户端最近 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")
      ]
  }
})
于 2013-04-28T20:00:03.323 回答