【问题标题】:Meteor collection get last document of each selection流星集合获取每个选择的最后一个文档
【发布时间】:2016-01-05 16:21:53
【问题描述】:

目前我使用以下查找查询来获取某个ID的最新文档

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

例如,我如何使用多个 ID 与 $in 一起使用

我使用以下查询进行了尝试。问题是它会将所有找到的 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}
                    });

【问题讨论】:

标签: mongodb meteor


【解决方案1】:

如上所述,您不想在此处使用$in。您可以通过循环遍历 CaveId 并分别对每个 CaveId 运行查询来解决此问题。

【讨论】:

    【解决方案2】:

    您基本上是在这里查看一个连接查询:您需要所有的 CaveId,然后最后查找每个。

    在我看来这是一个数据库模式/非规范化的问题:(但这只是一个观点!):

    您可以如此处所述,查找所有 caveIds,然后在每次需要查找最后一次潜水时为每个运行单个查询。

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

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

    【讨论】:

    • 嗨。我没有考虑过使用 lastDive 日期更新洞穴文档的解决方案。这可能会使它变得简单得多。正如您所提到的,我遇到了一个使用聚合功能进行排序和分组的解决方案。它确实有效,但不太确定它的性能有多昂贵。我将代码添加到我的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多