mongoose – 双向参考

我是Mongoose和MongoDB的新手,但即使在网上search了几个小时,我也找不到答案。

想象一下聊天应该在哪里聊天,只有成对的人才能一起聊天。 为此我创build了类似于以下的模式:

var schema = new mongoose.Schema({ chatWith: { type: mongoose.Schema.ObjectId, ref: 'User' } }); var User = mongoose.model('User', schema) 

题:

如果我将user2设置为chatWith与user1的path,是否可以在另一侧自动设置?

类似的东西:

 var user1 = new User(); var user2 = new User(); user1.chatWith = user2; user2.chatWith === user1; // true 

如果这是不可能的,那么实现这个目标最有效/最好的方法是什么?

处理这个问题的一个更好的方法是保留人们目前正在“聊天”的用户列表。 这可以通过在模式中使用数组types来完成:

 var schema = new mongoose.Schema({ chattingTo: [{ type: mongoose.Schema.ObjectId, ref: 'User' }] }); var User = mongoose.model('User', schema) 

然后,您真正需要的是用户_id值来build立对话。 这里虽然使用“multi” .update()方法和$addToSet运算符:

 User.update( { "_id": { "$in": [user1Id,user2Id] } }, { "$addToSet": { "chattingTo": { "$each": [user1Id,user2Id] } } } { "multi": true }, function(err,numAffected) { } ); 

这基本上同时更新所提供用户的“两个”,至less在单个操作中。 轻微的缺点是“user1”被列为与“user1”聊天,“user2”也是如此。 但是在阅读文档时,这不是一件困难的事情。

要结束对话,您可以从数组中$pull ,这将从两个用户中删除select:

 User.update( { "_id": { "$in": [user1Id,user2Id] } }, { "$pull": { "chattingTo": { "$in": [user1Id,user2Id] } } }, { "multi": true }, function(err,numAffected) { } ) 

同样,所有提供的用户都将从每个用户文档的“chattingTo”中删除。

请注意, $each修饰符仅适用于MongoDB 2.6或更高版本的$addToSet ,但由于您刚开始使用,因此这是您应该使用的版本。 如果不是的话,那就抓住它。