Mongodb Meteor collection获取每个选择的最后一个文档
目前,我使用下面的find查询来获取特定ID的最新文档Mongodb Meteor collection获取每个选择的最后一个文档,mongodb,meteor,Mongodb,Meteor,目前,我使用下面的find查询来获取特定ID的最新文档 Conditions.find({ caveId: caveId }, { sort: {diveDate:-1}, limit: 1, fields: {caveId:
Conditions.find({
caveId: caveId
},
{
sort: {diveDate:-1},
limit: 1,
fields: {caveId: 1, "visibility.visibility":1, diveDate: 1}
});
例如,如何使用多个ID和$in来使用相同的ID
我尝试了以下查询。问题是,对于所有找到的caveid,它将文档限制为1。但它应该为每个不同的caveId设置限制
Conditions.find({
caveId: {$in: caveIds}
},
{
sort: {diveDate:-1},
limit: 1,
fields: {caveId: 1, "visibility.visibility":1, diveDate: 1}
});
我提出的一个解决方案是使用聚合功能
var conditionIds = Conditions.aggregate(
[
{"$match": { caveId: {"$in": caveIds}}},
{
$group:
{
_id: "$caveId",
conditionId: {$last: "$_id"},
diveDate: { $last: "$diveDate" }
}
}
]
).map(function(child) { return child.conditionId});
var conditions = Conditions.find({
_id: {$in: conditionIds}
},
{
fields: {caveId: 1, "visibility.visibility":1, diveDate: 1}
});
如前所述,您不想在此处使用
$in
。您可以通过循环通过caveId并分别对每个caveId运行查询来解决此问题。您基本上是在这里查看联接查询:您需要所有caveId,然后最后查找每个caveId
在我看来,这是一个数据库模式/非规范化的问题:(但这只是一个观点!)
正如这里提到的,您可以查找所有caveIds
,然后在每次需要查找上一次潜水时,为每一次运行单个查询
但是,我认为最好是在cave
文档中记录/更新最后一次潜水,然后只通过lastdave
字段查找所有感兴趣的caveid
这将立即为您提供所需的内容,而不是进行昂贵的搜索/排序查询。这是以在文档中维护该字段为代价的,但听起来应该很简单,因为您只需要在新事件发生时更新一个字段。我认为您需要考虑使用Hi。我还没有想到用最后一次潜水日期更新cave文档的解决方案。这可能会让事情简单得多。我遇到了一个使用聚合功能进行排序和分组的解决方案,如您所述。它确实有效,但我不太确定它的性能有多贵。我在问题中添加了代码。