在一个mongoose模式数组字段

时间:2017-05-02 15:37:59

标签: mongodb express mongoose mongoose-schema

我想使用Mongoose返回有关用户填充其个人资料的信息。我一直在使用findOne通过嵌入式文档和.populate填充他们的评论列表以及基本的个人资料信息。我想通过计算friends数组中有多少对象来计算他们拥有的朋友。

看起来聚合就是这样做的,但我怎么能同时使用?或者是否有一种在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) {
//
})
)}




1 个答案:

答案 0 :(得分:0)

如果用户使用friends数组返回,为什么不返回user.friends.length?

如果您只想计算,请使用此

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() ...