web-dev-qa-db-fra.com

Mongoose trie le résultat agrégé

J'ai beaucoup de difficulté à résoudre ce problème de mongodb (mangouste).

Il existe ce schéma "Recommander" (nom d'utilisateur, roomId, ll et date) et sa collection contient la recommandation de l'utilisateur.

J'ai besoin d'obtenir une liste des chambres les plus recommandées (par roomId). Voici le schéma et ma solution éprouvée avec la requête mangouste.

var recommendSchema = mongoose.Schema({
    username: String,
    roomId: String,
    ll: { type: { type: String }, coordinates: [ ] },
    date: Date
})
recommendSchema.index({ ll: '2dsphere' });

var Recommend = mongoose.model('Recommend', recommendSchema);
Recommend.aggregate(
        {   
          $group: 
            { 
                _id: '$roomId', 
                recommendCount: { $sum: 1 } 
            }
        },
        function (err, res) {
            if (err) return handleError(err);
            var resultSet = res.sort({'recommendCount': 'desc'});

        }
    );
26
Renan Basso

Les résultats renvoyés par le pipeline d'agrégation ne sont que des objets simples. Vous effectuez donc le tri en tant qu'étape de pipeline, et non en tant qu'opération distincte:

Recommend.aggregate(
    [
        // Grouping pipeline
        { "$group": { 
            "_id": '$roomId', 
            "recommendCount": { "$sum": 1 }
        }},
        // Sorting pipeline
        { "$sort": { "recommendCount": -1 } },
        // Optionally limit results
        { "$limit": 5 }
    ],
    function(err,result) {

       // Result is an array of documents
    }
);

Il existe donc divers opérateurs de pipeline qui peuvent être utilisés pour $group ou $sort ou $limit et d'autres choses aussi. Celles-ci peuvent être présentées dans n'importe quel ordre et autant de fois que nécessaire. Le simple fait de comprendre qu'une étape de "pipeline" s'écoule se traduit par la suivante sur laquelle agir.

56
Neil Lunn