mongoose架构/查询

时间:2017-08-28 00:19:39

标签: mongoose mongoose-schema

我正在尝试在我的应用中构建一个朋友组件。

我仍然是来自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的id,而不是找到具有此用户名的用户,看看是否req.session.user.id是该用户的朋友阵列。

有更好的方法吗?

在MySQL中,它会像'users'中选择username ='something',然后检查结果以查看该结果的朋友数据中是否存在id。

1 个答案:

答案 0 :(得分: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数组,如果id列表中存在给定的数组,则该数组只包含一个friends

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