在mongoDB中查找特定字段的最新数据

在mongoDB中查找特定字段的最新数据,mongodb,nosql,mongodb-query,aggregation-framework,Mongodb,Nosql,Mongodb Query,Aggregation Framework,我为MongoDB集合中的数据设置了以下内容。我需要根据字段“eventType”查找最新数据 我使用“聚合”和“查找”查询,并根据时间戳字段“charttime”对其进行排序,以获取最新数据,但它不起作用。我需要根据字段“eventType”获取数据,以便为每个“eventType”获取最新数据。因此,在给定的示例中,我应该获得“LAB”和“EDLIST”的最新数据。理想情况下,它应该返回以下数据: { "_id" : ObjectId("5d5690843248b8c2048

我为MongoDB集合中的数据设置了以下内容。我需要根据字段“eventType”查找最新数据

我使用“聚合”和“查找”查询,并根据时间戳字段“charttime”对其进行排序,以获取最新数据,但它不起作用。我需要根据字段“eventType”获取数据,以便为每个“eventType”获取最新数据。因此,在给定的示例中,我应该获得“LAB”和“EDLIST”的最新数据。理想情况下,它应该返回以下数据:

{
        "_id" : ObjectId("5d5690843248b8c20481f5e9"),
        "mrn" : "xp35",
        "eventType" : "LAB",
        "eventSubType" : "CBB",
        "value" : 1,
        "units" : 1,
        "charttime" : ISODate("2019-08-16T16:46:22.393Z")
}
{
        "_id" : ObjectId("5d5690843248b8c20481f5ea"),
        "mrn" : "zfwy",
        "eventType" : "EDLIST",
        "eventSubType" : "L",
        "value" : 1,
        "units" : 1,
        "charttime" : ISODate("2019-08-16T16:46:24.394Z")
}
请遵循以下步骤:

  • 首先对所有文档进行排序
  • eventtype
    对其进行分组
  • 再次投影以将
    id
    正确地输入
    \u id
    (如果您使用
    id
    键没有问题,则不需要)
  • 再次对这些数据进行排序(如果您可以使用不同的
    eventype
    不按日期排序,则无需进行排序)
希望这有帮助

输出:

/* 1 */
{
    "_id" : ObjectId("5d5cedb1fc18699f18a24fa2"),
    "mrn" : "xp35",
    "eventType" : "LAB",
    "eventSubType" : "CBB",
    "value" : 1,
    "units" : 1,
    "charttime" : ISODate("2019-08-16T16:46:22.393Z")
}

/* 2 */
{
    "_id" : ObjectId("5d5cedc1fc18699f18a24fa9"),
    "mrn" : "zfwy",
    "eventType" : "EDLIST",
    "eventSubType" : "L",
    "value" : 1,
    "units" : 1,
    "charttime" : ISODate("2019-08-16T16:46:24.394Z")
}
db.collection.aggregate([
  { $sort: { charttime: -1 } },
  {
    $group: {
      _id: "$eventType",
      id: { $first: "$_id" },
      mrn: { $first: "$mrn" },
      eventType: { $first: "$eventType" },
      eventSubType: { $first: "$eventSubType" },
      value: { $first: "$value" },
      units: { $first: "$units" },
      charttime: { $max: "$charttime" }
    }
  },
  {
    $project: {
      _id: "$id",
      mrn: 1,
      eventType: 1,
      eventSubType: 1,
      value: 1,
      units: 1,
      charttime: 1
    }
  }
]);
====更新===== 根据您优化查询的要求:

db.collection.aggregate([
  { $sort: {"charttime": -1 }}, // Sort in descending. (So we would not have another sort after group)
  { $group: { 
      _id: "$eventType", // Group by event type
      data: {$first: "$$ROOT"} // Take whole first record
  }},
  { $replaceRoot: { newRoot: "$data" }} // Replaceroot to have document as per your requirement
])
====更新2==== 对于太多的记录: -查找事件类型和最大图表时间 -迭代每个文档并获取记录(您可能对DB有多个调用,但这将花费更少的时间)

注:-我已使用
506983
记录对其进行了测试,并在
0.526
秒获得了结果

  • 首先按
    charttime
    对数据进行排序(降序),以便
    $First
    蓄能器工作正常
  • 然后按
    eventType
    分组,并按查找最新日期
    $max
    累加器
  • $project
    管道将使用相同的键保留原始的
    \u id
    名称字段。如果它不是
    \u id
    所必需的,则可以卸下管道 总共
聚合查询:

/* 1 */
{
    "_id" : ObjectId("5d5cedb1fc18699f18a24fa2"),
    "mrn" : "xp35",
    "eventType" : "LAB",
    "eventSubType" : "CBB",
    "value" : 1,
    "units" : 1,
    "charttime" : ISODate("2019-08-16T16:46:22.393Z")
}

/* 2 */
{
    "_id" : ObjectId("5d5cedc1fc18699f18a24fa9"),
    "mrn" : "zfwy",
    "eventType" : "EDLIST",
    "eventSubType" : "L",
    "value" : 1,
    "units" : 1,
    "charttime" : ISODate("2019-08-16T16:46:24.394Z")
}
db.collection.aggregate([
  { $sort: { charttime: -1 } },
  {
    $group: {
      _id: "$eventType",
      id: { $first: "$_id" },
      mrn: { $first: "$mrn" },
      eventType: { $first: "$eventType" },
      eventSubType: { $first: "$eventSubType" },
      value: { $first: "$value" },
      units: { $first: "$units" },
      charttime: { $max: "$charttime" }
    }
  },
  {
    $project: {
      _id: "$id",
      mrn: 1,
      eventType: 1,
      eventSubType: 1,
      value: 1,
      units: 1,
      charttime: 1
    }
  }
]);

谢谢我们可以优化这个解决方案吗。就像在$group和$project中一样,您已经添加了每个字段。是否有其他方法包含所有字段?我使用的是mongoDB 3.2,我相信它不支持“$replaceRoot”@RunSmeagolRun,那么您需要对每个字段使用
$project
,或者什么都不用。您可以从后端代码处理它,以迭代
文档。数据
以拥有所有文档。我的集合中有10000000条记录,聚合花费了太多时间。你能提出其他解决方案吗?
db.collection.aggregate([
  { $sort: { charttime: -1 } },
  {
    $group: {
      _id: "$eventType",
      id: { $first: "$_id" },
      mrn: { $first: "$mrn" },
      eventType: { $first: "$eventType" },
      eventSubType: { $first: "$eventSubType" },
      value: { $first: "$value" },
      units: { $first: "$units" },
      charttime: { $max: "$charttime" }
    }
  },
  {
    $project: {
      _id: "$id",
      mrn: 1,
      eventType: 1,
      eventSubType: 1,
      value: 1,
      units: 1,
      charttime: 1
    }
  }
]);