comment utiliser mongodb aggregate et récupérer des documents entiers

je suis sérieusement déconcerté par la fonction agrégée de mongodb. Tout ce que je veux, c'est trouver le plus récent document de ma collection. Disons que chaque enregistrement a un champ "created"

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

donne le bon résultat, mais je veux le document entier dans le résultat? Comment dois-je procéder?

C'est la structure du document:

{
    "_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")
}
8
demandé sur Neil Lunn 2014-03-12 21:47:32

5 réponses

dans la documentation, j'ai trouvé que l'expression $$ROOT aborde ce problème.

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

10
répondu Volox 2015-02-18 11:06:50
query = [
    {
        '$sort': {
            'created': -1
        }
    },
    {
        $group: { 
            '_id':null,
            'max':{'$first':"$$ROOT"}
        }
    }
]
db.collection.aggregate(query)
3
répondu Vijay Karthik P 2017-02-17 05:48:45

je crois que j'ai compris. Par exemple, j'ai une collection contenant un tableau d'images (ou pointeurs). Maintenant je veux trouver le document avec le plus d'images

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}));
});

maintenant le tableau final contiendra le document avec le plus d'images. Puisque les images est un tableau, j'utilise $détendez-vous, je puis de les regrouper par document id et $somme:1, tuyau de dollars le groupe qui trouve le max, il pipe en marche arrière $de tri pour max et $groupe sur le premier résultat. Enfin je fetchOne le documentez et poussez-le dans le tableau des résultats.

1
répondu Jamgold 2014-03-13 23:52:00
db.collection.aggregate([
 {

  $group: {
   '_id':"$_id",
   'otherFields':{ $push: { fields: $ROOT } }
  } 
 }
])
1
répondu Med MANS 2018-05-21 13:43:03

vous devez utiliser db.collection.find () plutôt que db.collection.agrégat ():

db.collection.find().sort({"created":-1}).limit(1)
-3
répondu Anand Jayabalan 2014-03-12 18:38:13