Il existe plusieurs façons de résoudre ce problème. La solution sur laquelle je vais me concentrer utilise le cadre d'agrégation de mongodb. Tout d'abord, voici un pipeline d'agrégation qui résoudra votre problème, après il y aura une explication/décomposition de ce qui se passe dans la commande.
db.testagg.aggregate(
{ $unwind : '$likes' },
{ $group : { _id : '$_id', numlikes : { $sum : 1 }}},
{ $sort : { 'numlikes' : 1}})
Ce pipeline a 3 commandes principales:
1) Unwind: ce divise le champ 'aime' pour qu'il y ait 1 'comme' élément par document
2) La groupe: cette regroupe le document en utilisant le champ _id, en incrémentant le champ numLikes pour chaque document trouvé. Cela provoquera numLikes à être rempli avec un nombre égal au nombre d'éléments qui étaient dans "j'aime" avant
3) Trier: Enfin, nous trions les valeurs de retour dans l'ordre croissant basé sur numLikes. Dans un test j'ai couru la sortie de cette commande est:
{"result" : [
{
"_id" : 1,
"numlikes" : 1
},
{
"_id" : 2,
"numlikes" : 2
},
{
"_id" : 3,
"numlikes" : 3
},
{
"_id" : 4,
"numlikes" : 4
}....
Ceci est pour les données insérées par:
for (var i=0; i < 100; i++) {
db.testagg.insert({_id : i})
for (var j=0; j < i; j++) {
db.testagg.update({_id : i}, {'$push' : {'likes' : j}})
}
}
Notez que cela ne répond pas complètement à votre question, car il évite la question de choisir le date, mais il devrait vous aider à démarrer et à avancer dans la bonne direction.
Bien sûr, il existe d'autres moyens de résoudre ce problème. Une solution pourrait être de faire tout le tri et les manipulations côté client. Ceci est juste une méthode pour obtenir l'information que vous désirez. EDIT: Si vous trouvez cela un peu fastidieux, il y a un ticket pour ajouter un opérateur de taille $ à l'infrastructure d'agrégation, je vous invite à regarder et potentiellement à l'augmenter pour essayer d'accélérer l'ajout de cet opérateur si vous êtes intéressé.
Oui, vous pouvez utiliser le [cadre d'agrégation] (http://docs.mongodb.org/manual/applications/aggregation/) pour effectuer des requêtes de ce type. – JohnnyHK