从系列中获取最后一次插入

时间:2016-08-05 08:19:09

标签: mongodb

我正在使用我的应用程序为每个用户构建一系列数据。

文档格式如下

var obj = getData();
obj.end(function(err,res){
        if(err==null && res.ok){
          let js = JSON.stringify(res.body);
          obj = JSON.parse(js);
        }
      })

我正在寻找一个简单的查询来获取用户列表的最后插入数据("时间戳")(使用" userId")。

请参阅我目前的实施情况。

{ "userId": String, "timestamp": DateTime, "data": Data }

2 个答案:

答案 0 :(得分:3)

您可以使用aggregation-framework来完成它。在timestamp字段上有一个$group阶段和$max运算符的聚合管道

db.yourCollection.aggregate( 
  { $group: { _id: "$userId", "last": { $max: "$timestamp" } } } 
);

收集文件

{ "userId" : "1", "timestamp" : 1470385420806, "data" : "123" }
{ "userId" : "1", "timestamp" : 1470386440616, "data" : "456" }
{ "userId" : "2", "timestamp" : 1470385598845, "data" : "222" }
{ "userId" : "2", "timestamp" : 1470385602249, "data" : "333" }

会给你结果

{ "_id" : "1", "last" : 1470386440616 }
{ "_id" : "2", "last" : 1470385602249 }

这似乎是你所期望的。

答案 1 :(得分:0)

您可以在查询中声明多个用户,按时间戳对其进行排序并仅返回一个。就像这样:

db.users.find({userId: {$in:[your_list_ids]}}, {fields_you_need}).sort({timestamp: -1}).limit(1)

因此,此请求查找组中的所有用户(每个人,其userId在数组中),然后按“timestamp”字段对其进行降序排序,并将输出限制为1条记录。

记住!要快速排序,您必须将索引应用于已排序的字段。