2016-01-04 68 views
0

目前我使用下面的查找查询,以获得一定的ID的最新文档的最后文件流星收集得到每个选择

Conditions.find({ 
         caveId: caveId 
        }, 
        { 
         sort: {diveDate:-1}, 
         limit: 1, 
         fields: {caveId: 1, "visibility.visibility":1, diveDate: 1} 
        }); 

我如何可以使用相同的使用与$多个ID在例如

我试着用下面的查询。问题在于它会将所有找到的洞穴标识的文件数限制为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

我想你需要看看使用https://docs.mongodb.org/manual/reference/method/db.collection.distinct/ –

回答

0

你不想在这里使用$in注意。您可以通过循环遍历caveIds并单独在每个caveId上运行查询来解决此问题。

0

你基本上在这里查看联接查询:你需要所有的caveIds,然后查找每个caveIds。

这是在我看来,数据库架构/非规范化的问题:(但这只是一个意见!):

你可以这里提到,查找所有caveIds,然后运行每个单号查询,每单次你需要查看最后的潜水。

但是我认为你的记录/更新cave文档中的最后一个潜水要好得多,然后查找所有感兴趣的洞穴文件,只需要填入lastDive字段。

这会立即给你你需要的,而不是经过昂贵的搜索/排序查询。这是以在文档中维护该字段为代价的,但它听起来应该相当平凡,因为只有在发生新事件时才需要更新一个字段。

+0

嗨。我没有想到实际上用lastDive日期更新洞穴文档的解决方案。这可能会使它简单得多。我已经遇到了一个使用聚合功能的解决方案,按照您所提到的方式进行排序和分组它确实有效,但我们不太清楚它在性能上的价格。我将代码添加到了我的问题中。 – Chris