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