目前,我使用以下查找查询来获取特定ID的最新文档
Conditions.find({
caveId: caveId
},
{
sort: {diveDate:-1},
limit: 1,
fields: {caveId: 1, "visibility.visibility":1, diveDate: 1}
});
如何使用带有$ in的多个ID(例如
)来使用相同的内容我尝试使用以下查询。问题是它会将所有找到的caveIds的文档限制为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}
});
答案 0 :(得分:0)
如上所述,您不想在此使用$in
。您可以通过循环遍历caveIds并在每个caveId上单独运行查询来解决此问题。
答案 1 :(得分:0)
你基本上在这里看一个连接查询:你需要所有的caveIds,然后为每个查询最后一次。
在我看来,这是数据库架构/非规范化的问题:(但这只是一个意见!):
你可以在这里提到,查找所有caveIds
,然后每次需要查看最后一次潜水时为每一次运行单个查询。
但是,我认为你最好记录/更新cave
文档中的最后一次潜水,然后查找所有感兴趣的洞穴,只拉动lastDive
字段。
这将立即为您提供所需,而不是通过昂贵的搜索/排序查询。这是以维护文档中的该字段为代价的,但听起来应该相当简单,因为您只需要在发生新事件时更新一个字段。