Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 猫鼬-双向参考_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Javascript 猫鼬-双向参考

Javascript 猫鼬-双向参考,javascript,node.js,mongodb,mongoose,mongodb-query,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上的chatWit

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

想象一个聊天室,只有两个人在一起聊天。为此,我创建了类似以下内容的模式:

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

var User = mongoose.model('User', schema)
问题:

如果我在user1上的
chatWith
path中设置user2,是否可以在另一侧自动设置它

诸如此类:

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

如果不可能,实现这一点最有效/最好的方法是什么?

处理这一问题的更好方法是保留用户当前“聊天”的列表。这可以通过在架构中使用数组类型来完成:

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

var User = mongoose.model('User', schema)
然后,您真正需要的就是用户
\u id
值来建立对话。在这里,尽管您使用“multi”方法和运算符:

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

    }
);
基本上,至少在单个操作中,它或多或少同时更新所提供用户的“两个”。稍有缺点的是,“user1”被列为与“user1”聊天,而“user2”也是如此。但在阅读文档时,这并不是一件很难过滤的事情

要结束对话,您可以从阵列中选择,这将从两个用户中删除所选内容:

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

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


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

你要找的是图形数据库,而不是文档数据库。@Philipp如果有一个非常合理的MongoDB方法来处理这个问题,你为什么要这么说?除了“自动引用”之外,还有其他方法可以实现这一点。考虑到通常是如何在图形数据库中处理关联。