Quiero usar Mongoose para devolver información sobre un usuario para completar su perfil. He estado usando findOne para completar una lista de sus comentarios junto con información básica del perfil a través de documentos incrustados y con .populate. Quiero contar los amigos que tienen contando cuántos objetos hay en la matriz de amigos.
Parece que el agregado es uno de hacer eso, pero ¿cómo puedo usar ambos? ¿O hay una manera simple de hacer un conteo en la consulta findOne?
var UserSchema = new Schema({ username: String, comments : [{ type: Schema.Types.ObjectId, ref: 'Comment' }], friends: [ { id: { type: Schema.Types.ObjectId, ref: 'User' }, permission: Number } ] }) var User = mongoose.model('User', UserSchema); var Comment = mongoose.model('Comment', CommentSchema); app.get('/profile/:username', function(req, res) { User .findOne({ username: req.params.username }, 'username friends -_id') .populate({ path: 'current', model: 'Comment', select: 'comment author -_id date', populate: { path: 'author', model: 'User', select: 'username firstName lastName -_id' } }) .exec(function(err, user) { // }) )}
Si el usuario regresa con una matriz de amigos, ¿por qué no regresa solo user.friends.length?
Si solo quieres contar, usa esto
User.aggregate([ { $match: { username: req.params.username } }, { $unwind: "$comments" }, { $lookup: { from: "Comment", localField: "comments", foreignField: "_id", as: "comments" } }, { "$group": { "_id": "$_id", "friends": { "$first": "$friends"}, "comments": { "$push": "$comments" } } }, { $project: { _id: 0, count: {$size: '$friends'}, comments: 1, username: 1 } } ]).exec() ...