【问题标题】:Mongoose - bidirectional referenceMongoose - 双向参考
【发布时间】:2014-09-30 00:58:41
【问题描述】:

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

如果不可能,最有效/最好的方法是什么?

【问题讨论】:

  • 您正在寻找图形数据库,而不是文档数据库。
  • @Philipp 当有一个完全合理的 MongoDB 方法来处理这个问题时,你为什么要这样说?除了“自动引用”之外,还有其他方法可以做到这一点。考虑到这通常是图形数据库中处理关联的方式。

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


【解决方案1】:

处理此问题的更好方法是保留人们当前“与之聊天”的用户列表。这可以通过在模式中使用数组类型来完成:

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

var User = mongoose.model('User', schema)

那么您真正需要的是用户_id 值来建立对话。这里虽然你使用“multi”.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,但由于您才刚刚开始,因此这是您应该使用的版本。如果没有,那就抓住它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2015-03-04
    • 2016-06-12
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多