如何使用mongodb聚合并检索整个文档

时间:2014-03-12 17:47:33

标签: mongodb aggregation-framework

我对mongodb的综合功能感到困惑。我想要的就是在我的收藏中找到最新的文档。让我们说每个记录都有一个字段"创建"

db.collection.aggregate({
    $group: { 
        _id:0,
        'id':{$first:"$_id"},
        'max':{$max:"$created"}
    }
})

产生正确的结果,但我希望结果中的整个文档?我该怎么做?

这是文件的结构:

{
    "_id" : ObjectId("52310da847cf343c8c000093"),
    "created" : 1389073358,
    "image" : ObjectId("52cb93dd47cf348786d63af2"),
    "images" : [
        ObjectId("52cb93dd47cf348786d63af2"),
        ObjectId("52f67c8447cf343509d63af2")
        ],
    "organization" : ObjectId("522949d347cf3402c3000001"),
    "published" : 1392601521,
    "status" : "PUBLISHED",
    "tags" : [ ],
    "updated" : 1392601521,
    "user_id" : ObjectId("52214ce847cf344902000000")
}

5 个答案:

答案 0 :(得分:13)

在文档中,我发现 $$ROOT 表达式解决了这个问题。

来自DOC: http://docs.mongodb.org/manual/reference/operator/aggregation/group/#group-documents-by-author

答案 1 :(得分:3)

query = [
    {
        '$sort': {
            'created': -1
        }
    },
    {
        $group: { 
            '_id':null,
            'max':{'$first':"$$ROOT"}
        }
    }
]
db.collection.aggregate(query)

答案 2 :(得分:2)

db.collection.aggregate([
 {

  $group: {
   '_id':"$_id",
   'otherFields':{ $push: { fields: $ROOT } }
  } 
 }
])

答案 3 :(得分:1)

我想我明白了。例如,我有一个包含图像(或指针)数组的集合。现在我想找到图像最多的文档

results=[];
db.collection.aggregate([
    {$unwind: "$images"},
    {$group:{_id:"$_id", 'imagecount':{$sum:1}}},
    {$group:{_id:"$_id",'max':{$max: "$imagecount"}}},
    {$sort:{max:-1}},
    {$group:{_id:0,'id':{$first:'$_id'},'max':{$first:"$max"}}}
]).result.forEach(function(d){
    results.push(db.stories.findOne({_id:d.id}));
});

现在最后一个数组将包含图像最多的文档。由于图像是一个数组,我使用$ unwind,然后按文档ID和$ sum:1进行分组,将其输入到找到最大值的$组中,将其管理为反向$ sort for max和$ group out第一个结果。最后,我获取文档并将其推入结果数组。

答案 4 :(得分:-3)

您应该使用db.collection.find()而不是db.collection.aggregate():

db.collection.find().sort({"created":-1}).limit(1)