我正在使用我的应用程序为每个用户构建一系列数据。
文档格式如下
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 }
答案 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条记录。
记住!要快速排序,您必须将索引应用于已排序的字段。