[英]Mongo Aggregation
我的收藏中有以下文件
{
"_id": ObjectId("54490b8104f7142f22ecc97f"),
"title": "Sample1",
"slug": "samplenews",
"cat": "sports",
"desc": "sampletextsampletext",
"published_date": ISODate("2014-10-23T14:06:57.0Z"),
} {
"_id": ObjectId("54490b8104f7142f22ecc97f"),
"title": "Sample2",
"slug": "samplenews2",
"category": "entertaintment",
"desc": "sampletextsampletext",
"published_date": ISODate("2014-10-22T14:06:57.0Z"),
} {
"_id": ObjectId("54490b8104f7142f22ecc97f"),
"title": "Sample3",
"slug": "samplenews3",
"category": "entertaintment",
"desc": "sampletextsampletext",
"published_date": ISODate("2014-9-22T14:06:57.0Z"),
} {
"_id": ObjectId("54490b8104f7142f22ecc97f"),
"title": "Sample4",
"slug": "samplenews4",
"category": "other",
"desc": "sampletextsampletext",
"published_date": ISODate("2014-10-22T14:06:57.0Z"),
}
我需要一个查询来获取每个类别的前5条最新消息。有什么建议吗?
假设您安装了最新版本的mongodb,执行此操作的一种方法是:
Sort
基础上,记录published_date
降序排列。 category
对记录进行group
。 对于每个组,将所有记录收集到一个阵列中。 slice
。 $slice
在服务器端$project
聚合管道运算符中不可用,这使我们无法在服务器端执行操作。
var result = db.collection.aggregate(
[
{$sort:{"published_date":-1}},
{$group:{"_id":"$category","values":{$push:"$$ROOT"}}}
]
).map(function(doc){
return {"category":doc._id,"records":doc.values.slice(0,5)};
});
result
变量现在将是一个文档数组。 每个文档代表每个category
并依次包含前5
记录的数组。
您可以排序,然后限制您的请求。
$top_five_other = iterator_to_array($db->find(array('category'=>'other')->sort(array('published_date'=>-1))->limit(5));
您可以尝试汇总查询
1-db.collection.aggregate({$ group:{_id:{category:“ $ category”},total:{$ sum:1}}},{$ sort:{_ id:1}})
要么
db.collection.aggregate({$ group:{_id:{category:“ $ category”},total:{$ sum:1}}},{$ sort:{_ id:1}}).. forEach(function( myDoc){print(myDoc._id.category);
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.