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