猫鼬 - 双向参考

时间:2014-08-06 22:39:08

标签: javascript node.js mongodb mongoose mongodb-query

我是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

如果不可能,实现这一目标的最有效/最佳方式是什么?

1 个答案:

答案 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,但由于您刚开始使用,因此这是您应该使用的版本。如果没有,那就抓住吧。