我是Mongoose和MongoDB的新手,但即使经过几个小时的互联网搜索,我也找不到答案。
想象一下,聊天哪里应该只有成对人聊天。为此,我创建了与此类似的模式:
var schema = new mongoose.Schema({
chatWith: { type: mongoose.Schema.ObjectId, ref: 'User' }
});
var User = mongoose.model('User', schema)
问题:
如果我在user1的chatWith
路径中设置user2,可能会在另一端自动设置吗?
类似的东西:
var user1 = new User();
var user2 = new User();
user1.chatWith = user2;
user2.chatWith === user1; // true
如果不可能,实现这一目标的最有效/最佳方式是什么?
答案 0 :(得分:2)
处理此问题的更好方法是保留人们当前“聊天”的用户列表。这可以通过在模式中使用数组类型来完成:
var schema = new mongoose.Schema({
chattingTo: [{ type: mongoose.Schema.ObjectId, ref: 'User' }]
});
var User = mongoose.model('User', schema)
然后您真正需要的是用户_id
值来设置对话。这里虽然您使用“多”.update()
方法和$addToSet
运算符:
User.update(
{ "_id": { "$in": [user1Id,user2Id] } },
{ "$addToSet": { "chattingTo": { "$each": [user1Id,user2Id] } } }
{ "multi": true },
function(err,numAffected) {
}
);
这基本上或多或少同时更新所提供用户的“两者”,至少在单个操作中。略微缺点是“user1”被列为与“user1”聊天,而“user2”则相同。但是在阅读文档时过滤并不困难。
要结束对话,您可以从数组中$pull
,这将删除两个用户的选择:
User.update(
{ "_id": { "$in": [user1Id,user2Id] } },
{ "$pull": { "chattingTo": { "$in": [user1Id,user2Id] } } },
{ "multi": true },
function(err,numAffected) {
}
)
同样,所有提供的用户都将从每个用户文档中的“chattingTo”中删除。
请注意,$each
修饰符仅适用于MongoDB 2.6或更高版本的$addToSet
,但由于您刚开始使用,因此这是您应该使用的版本。如果没有,那就抓住吧。