2017-08-28 90 views
0

我想在我的应用程序中构建出一个好友组件。猫鼬模式/查询

对于来自MySQL背景的Mongo/Mongoose,我还是比较新的。

我在这里要做的是访问用户的个人资料,如果他们的个人资料有私人设置,然后检查该用户是否有用户访问他们的网页作为朋友。

假设我有一个用户模式

var UserSchema = new Schema({ 
username  : String, 
friends  : [{ id: { type: Schema.Types.ObjectId, ref: 'User'}, status: Number }], 
}); 

var User   = mongoose.model('User', UserSchema); 

User.findOne({username: 'req.params.username', 'friends.id': req.session.user.id}, function (err, user) 
if(user){ 
    user.isFriend = true; 
} 
}); 

我觉得好像这只是查找与req.params.username任何的用户名或与req.session.user.id任何标识,而不是找用户使用该用户名并查看req.session.user.id是否在该用户的朋友阵列中。

有没有更好的方法来做到这一点?

在MySQL中,它可能类似于从'users'中选择username ='something',然后检查结果以查看该结果的朋友数据中是否存在id。

回答

1

您的查询总是返回_id: username如果它存在的文档。你需要做的是获取friends字段并循环查看id是否存在。或者使用聚合的简单查询也可以工作。

User.aggregate([{$match: {_id: req.params.username, 
           'friends.id': req.session.user.id}}, 
        {$project: {friends: {$filter: { 
                input: '$friends', 
                as: 'fr', 
                cond: {$eq: ['$$fr.id', req.session.user.id]} 
                } 
             } 
           } 
        } 
        ]); 

上述应返回的阵列与一个项目,并且一个项具有friends阵列中呢,这反过来,如果在friends列表中存在的给定的一个包括仅一个id

注意:req.session.user.id应该是Schema.Types.ObjectId类型。