我想获取给定用户和给定位置的最新进入和退出时间戳。这个集合是这样的
{ "ActivityList" : [
{ "type" : "exit",
"timestamp" : Date( 1348862537170 ),
"user" : { "$ref" : "userProfile",
"$id" : ObjectId( "4fdeaeeede26fd298262bb80" ) } },
{ "type" : "entry",
"timestamp" : Date( 1348862546966 ),
"user" : { "$ref" : "userProfile",
"$id" : ObjectId( "4fdeaeeede26fd298262bb80" ) } },
{ "type" : "entry",
"timestamp" : Date( 1348870744386 ),
"user" : { "$ref" : "userProfile",
"$id" : ObjectId( "4fdeaf6fde26fd298262bb81" ) } },
{ "type" : "exit",
"timestamp" : Date( 1348878233785 ),
"user" : { "$ref" : "userProfile",
"$id" : ObjectId( "4fdeaf6fde26fd298262bb81" ) } } ],
"Location" : { "$ref" : "loc",
"$id" : ObjectId( "4fd410f0e7e994b59054b824" ) },
"_id" : ObjectId( "4fe8f3c6e7e9ebe3697ee836" ) }
我尝试了类似的东西但是没有用
db.collection.group(
{
keyf: function(doc) {
return {
location :doc.Location._id,
userid : doc.ActivityList.user._id,
actiontype : doc. ActivityList.type
};
},
reduce: function(obj,prev) {
if (prev.maxdate < obj. ActivityList.timestamp) {
prev.maxdate = obj. ActivityList.timestamp;
}
},
initial: {maxdate:0}
});
感谢您的帮助。
答案 0 :(得分:2)
简单的$group
不会为您的数据结构工作并查找/过滤数组中的最大值。您必须迭代数组才能找到最大值,这可以通过检索文档并在应用程序代码中迭代来更有效地完成。
MongoDB 2.2中可能的服务器查询方法是使用新的Aggregation Framework:
db.activity.aggregate(
// Find matching location documents first (can take advantage of index)
{ $match : {
Location: {
"$ref" : "loc",
"$id" : ObjectId("4fd410f0e7e994b59054b824")
}
}},
// Unwind the ActivityList arrays as a document stream
{ $unwind : "$ActivityList" },
// Filter activities to the user reference of interest
{ $match : {
'ActivityList.user': {
"$ref" : "userProfile",
"$id" : ObjectId("4fdeaeeede26fd298262bb80")
}
}},
// Group the stream by activity types, and get the timestamp for the latest of each
{ $group : {
_id : "$ActivityList.type",
latest: { $max: '$ActivityList.timestamp' }
}}
)
示例结果:
{
"result" : [
{
"_id" : "entry",
"latest" : ISODate("2012-09-28T20:02:26.966Z")
},
{
"_id" : "exit",
"latest" : ISODate("2012-09-28T20:02:17.170Z")
}
],
"ok" : 1
}