Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Meteor collection获取每个选择的最后一个文档_Mongodb_Meteor - Fatal编程技术网

Mongodb Meteor collection获取每个选择的最后一个文档

Mongodb Meteor collection获取每个选择的最后一个文档,mongodb,meteor,Mongodb,Meteor,目前,我使用下面的find查询来获取特定ID的最新文档 Conditions.find({ caveId: caveId }, { sort: {diveDate:-1}, limit: 1, fields: {caveId:

目前,我使用下面的find查询来获取特定ID的最新文档

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文档的解决方案。这可能会让事情简单得多。我遇到了一个使用聚合功能进行排序和分组的解决方案,如您所述。它确实有效,但我不太确定它的性能有多贵。我在问题中添加了代码。