繁体   English   中英

Mongo汇总

[英]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 对于每个组,将所有记录收集到一个阵列中。
  • 在javascript /客户端代码中,对每个组(类别)的前5条记录进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM