试图从集合中提取$ first文档

时间:2012-12-03 20:56:54

标签: mongodb aggregation-framework database

通过聚合框架管理各种文档后,我终于得到了结果文档。

现在的问题是我只想要$ first和$ last文档。

最终文件看起来像这样(巨大的清单):

            ...
            {
                    "_id" : "Kaila Deibler",
                    "count" : 406
            },
            {
                    "_id" : "Jessika Dagenais",
                    "count" : 406
            },
            {
                    "_id" : "Tamika Schildgen",
                    "count" : 404
            },
            ...

我用来制作文档的mongo shell命令是:
db.talks.aggregate([{$project: {_id: 0, comments: "$comments"}}, {$unwind: "$comments"}, {$group: {_id: "$comments.author", count: {$sum: 1}}}, {$sort: {count: -1}}])

但我只需要第一个和最后一个文件,所以我尝试了这样的事情:
db.talks.aggregate([{$project: {_id: 0, comments: "$comments"}}, {$unwind: "$comments"}, {$group: {_id: "$comments.author", count: {$sum: 1}}}, {$sort: {count: -1}}, {$first: "$_id"}])

我尝试了其他实施,但似乎无法确定实施$first$last

的时间/地点

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

$first$last$group管道中的聚合函数,这意味着您需要在$group文档中使用它们。

db.talks.aggregate([{$project: {_id: 0, comments: "$comments"}}, {$unwind: "$comments"}, {$group: {_id: "$comments.author", count: {$sum: 1}, first: {$first:"$_id"}}}, {$sort: {count: -1}}])

同样适用于$last

您可以找到显示此here

的示例

答案 1 :(得分:0)

以下是我对这个问题的回答:

db.talks.aggregate([{$project: {_id: 0, comments: "$comments"}}, {$unwind: "$comments"}, {$group: {_id: "$comments.author", count: {$sum: 1}}}, {$sort: {count: -1}}, {$group: {_id: "$_id.comments.author", first: {$first: "$_id"}, last: {$last: "_id"}}}])

由于我想在排序后提取第一个和最后一个文档,因此我必须使用$group$first应用另一个$last。结果:

{
        "result" : [
                {
                        "_id" : null,
                        "first" : "Elizabet Kleine",
                        "last" : "Mariela Sherer"
                }
        ],
        "ok" : 1
}

请注意"_id" : null。这有必要吗?
如果有人有更好的解决方案,请分享。