mongodb - 您将如何在 MongoDB 中建立友谊关系模型?

标签 mongodb data-modeling

我知道已经给出了很多答案,建议嵌入对其他用户的引用数组,但所有此类答案都忽略了友谊是双向关系,当 Alice 是 Bob 的 friend 时,Bob 是自动爱丽丝的 friend 。我不是在模仿追随者。

所以我不想在每次新用户进入系统时都保留两个引用。我需要一个考虑到关系的双向性质的模型。

我在考虑友谊“边缘”的集合,其中每个文档都包含对两个用户的引用。想知道关于这方面的文献是否已经存在。

最佳答案

MongoDB 通常不适合建模图形关系。有专门的图形数据库擅长这项任务。

但是,如果您不想在组合中添加其他数据库技术,我建议创建一个新集合 frienships 并将每个 friend 关系建模为包含两个条目的数组的文档,它们中的每一个都是一个对象,其中包含关于您需要在 friend 列表中显示条目的用户之一的缩写信息:

{
    friendship: [
       {
            id:123,
            name: "Bob",
            avatar: "Bob.jpg"
       },
       {
            id:456,
            name: "Alice",
            avatar: "Alice.jpg"
       }
    ]
}

在好友文档中复制用户文档的信息是为了避免二次查询用户集合获取显示用户好友列表的所有数据。 MongoDB 不能执行 JOIN can only perform JOINs on unsharded collections ,因此您应该避免将特定用例所需的数据分散到多个集合中,即使这意味着您会创建冗余。否则,您将需要一个接一个地执行多个查询,这会显着降低应用程序的响应时间。

当你想获得用户 123 的好友列表时,你将执行 db.friendships.find({"friendship.id", 123})( 上的索引friendship.id 将提高性能),然后收到 Bob 是第一个或第二个 friend 的文档列表。

然后您将迭代这些文档并输出数组条目的简短信息,该数组条目不是用户 123。

或者,您可以使用聚合管道过滤掉数据库中的 Bob 条目。使用上面的 $match 查询,$unwind 友谊数组,然后 $match 那些 id 不是 123 的文档。这将是一个权衡:您以数据库服务器上的 CPU 负载为代价来节省带宽。

要查询友谊关系是否已经存在,请使用:

db.friendships.find( { $and: [ 
       { "friendship.id": 123 }, 
       { "friendship.id": 456 } 
    ] } ).count();

关于mongodb - 您将如何在 MongoDB 中建立友谊关系模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703788/

相关文章:

mongodb - 从子文档到 csv 的 mongoexport 字段

java - 如何使用 java 驱动程序更新 mongo db 中的文档字段?

MongoDB BasicDBObject 与 Java 中的文档

javascript - 使用 Node.js 在 Mongodb 中存储 JS 函数的问题

c# - Entity Framework Multi-Tenancy 共享数据架构 : single column, 多个外键

postgresql - 在 Postgres 中存储固定长度小数组的最佳数据模型(使用 SqlAlchemy)

java - 从现有 ArrayList 创建 ArrayList

c# - 'MongoDB.Bson.BsonElement' 不是简单 POCO 上的属性类

database - 通过常识确定候选键?

database-design - 支持应用程序中自定义字段的设计模式有哪些?