1

我有一组看起来像这样的日志数据对象。

{
"_id" : ObjectId("52613da744aed3235450e6a9"),
"site" : "5-29",
"date" : ISODate("2013-10-18T10:41:17Z"),
"measures" : [
    [
        "Tank Lvl (ft)",
        6.923
    ],
    [
        "Internal Temp (C)",
        -5.6
    ],
    [
        "External Temp (C)",
        -8.1
    ],
    [
        "Batt (V)",
        12.65
    ],
    [
        "Well Press (psi)",
        31.905
    ]
]
}

每天很多时候,系统会收集更多的数据。我正在尝试制定一个查询,该查询将返回特定站点特定日期的最新值。在特定日期之后,我可以轻松地从特定站点询问所有数据,但这会给我每天的所有记录。我只想要每个站点的最新信息。例如:

给定以下集合:(忽略噪音......)

1. { "site" : "5-29",   "date" : ISODate("2013-10-18T10:41:17Z"), ....}
2. { "site" : "5-29",   "date" : ISODate("2013-10-18T10:42:17Z"), ....}
3. { "site" : "5-29",   "date" : ISODate("2013-10-18T10:43:17Z"), ....}
4. { "site" : "5-28",   "date" : ISODate("2013-10-18T10:41:17Z"), ....}
5. { "site" : "5-28",   "date" : ISODate("2013-10-18T10:42:17Z"), ....}
6. { "site" : "5-28",   "date" : ISODate("2013-10-18T10:43:17Z"), ....}

我希望查询只返回记录 3 和 6,因为它们是该站点在给定日期的最新条目。

4

2 回答 2

2

你可以像这样运行查询

db.collection.find({ "site" : "5-29", "date" : ISODate("2013-10-18T10:41:17Z")}).sort({_id:-1}).limit(3);

它将返回"site" : "5-29",created on的最新三个记录"date" : ISODate("2013-10-18T10:41:17Z")

因为 mongodb 创建的 ObjectId 由这些部分组成

  1. 表示自 Unix 纪元以来的秒数的 4 字节值
  2. 3 字节机器标识符
  3. 2 字节进程 ID,以及
  4. 3 字节计数器,以随机值开始。

sort by _id 根据创建时间记录排序记录。所以反向排序给出了表中的最新结果。

于 2013-10-18T16:18:34.223 回答
2

如果要查找每个站点的最新记录,请使用聚合框架:

db.collection.aggregate([
  {
    $match: { date: {
      $gt: new ISODate("2013-10-18T00:00:00Z"),
      $lt: new ISODate("2013-10-18T23:59:59Z") }
    }
  },
  {
    $sort: { date: 1 }
  },
  {
    $group: {
      _id: "$site",
      date: { $last: "$date" }
      // ... other document fields
    }
  }
]);
  • 起初,只保留指定日期的记录
  • 然后按日期时间排序
  • 最后,按“站点”字段对记录进行分组,并从分组集中的最后一个文档中获取信息。
于 2013-10-18T18:01:40.930 回答