流星集合获取每个选择的最后一个文档

时间:2016-01-04 12:31:32

标签: mongodb meteor

目前,我使用以下查找查询来获取特定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}
                    });

2 个答案:

答案 0 :(得分:0)

如上所述,您不想在此使用$in。您可以通过循环遍历caveIds并在每个caveId上单独运行查询来解决此问题。

答案 1 :(得分:0)

你基本上在这里看一个连接查询:你需要所有的caveIds,然后为每个查询最后一次。

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

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

但是,我认为你最好记录/更新cave文档中的最后一次潜水,然后查找所有感兴趣的洞穴,只拉动lastDive字段。

这将立即为您提供所需,而不是通过昂贵的搜索/排序查询。这是以维护文档中的该字段为代价的,但听起来应该相当简单,因为您只需要在发生新事件时更新一个字段。