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")
}
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
query = [
{
'$sort': {
'created': -1
}
},
{
$group: {
'_id':null,
'max':{'$first':"$$ROOT"}
}
}
]
db.collection.aggregate(query)
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.
db.collection.aggregate([
{
$group: {
'_id':"$_id",
'otherFields':{ $push: { fields: $ROOT } }
}
}
])
vous devez utiliser db.collection.find () plutôt que db.collection.agrégat ():
db.collection.find().sort({"created":-1}).limit(1)