如何使用MongoDB集合中的匹配键获取最后N个元素

时间:2017-01-28 21:03:42

标签: mongodb mongoose

我有一个文档集合,如下所示:

[
 {
   "_id": "588cf61e5120ac11d4366f5c",
   "title": "This is a test entry",
   "entrybody": "This is the body of an entry",
   "creationdate": 1111,
   "author": "1223cllclclclc",
   "__v": 0
  },
 {
   "_id": "588cf6a556414f02f4e6a865",
   "title": "This is a new entry",
   "entrybody": "This is the body of an nuew entry",
   "creationdate": 11114040050505,
   "author": "1223cllclclclclslslsl",
   "__v": 0
 },
 {
   "_id": "588cf767fc2ede200cd5738e",
   "title": "This is a new entry",
   "entrybody": "This is the body of an nuew entry",
   "creationdate": 11114040050505,
   "author": "1223cllclclclclslslsl",
   "__v": 0
   }
  .....
]

我想得到每位作者的最后n条记录,然后按照创建日期排序,我已经查找了如何通过聚合执行此操作但是我卡住了。

我需要集合的最后N个文档与特定密钥(例如作者)匹配,然后我必须按照"创建日期"对结果进行排序。我认为这与这个问题不同mongodb: how to get the last N records?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。

$sort在最后author处理每个creationdate的记录。

$group$project为每个author选择最后N条记录。

$unwind$sortcreationdate处理记录。

db.collection.aggregate({
    $sort: {
        author: 1,
        creationdate: -1
    }
}, {
    $group: {
        _id: "$author",
        data: {
            $push: "$$ROOT"
        }
    }
}, {
    $project: {
        _id: 0,
        lastN: {
            $slice: ["$data", N]
        }
    }
}, {
    $unwind: "$lastN"
}, {
    $sort: {
        "lastN.creationdate": -1
    }
})

答案 1 :(得分:0)

以下是使用forEach方法解决问题的另一种方法:

var result = {};
db.collection.find().sort({"author": 1, "creationda‌‌te":-1}).forEach(function(doc) { 
    if (!(doc.author in result)) { 
        result[doc.author] = [];
    }
    if (result[doc.author].length < 5) { 
        result[doc.author].push(doc); 
    } 
})

执行后,result变量填充了由作者姓名分隔的文档,如

{
    'author1': [
        {doc1},
        {doc2}
    ],
    'author2': [
        {doc1},
        {doc2}
    ]
}