我知道已经给出了许多答案,建议将一系列引用嵌入到其他用户中,但这种疏忽的所有答案都是友谊是双向关系,当Alice是Bob的朋友时,Bob自动成为Alice的朋友。我不是为粉丝建模。
所以每次新用户进入系统时我都不想保留两个引用。我需要一个考虑到这种关系双向性的模型。
我正在考虑友谊'边缘'的集合,其中每个文档都包含对两个用户的引用。想知道有关这方面的文献是否已经存在。
MongoDB通常不适合建模图关系。有专门的图形数据库,擅长这项任务。
但是,当您不想添加其他数据库技术时,我建议创建一个新的集合frienships
并将每个friend-relation建模为一个包含两个条目数组的文档,每个条目都是一个带有缩写信息的对象关于您需要在朋友列表中显示条目的其中一个用户:
{
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是第一个或第二个朋友的文档列表。
然后,您将迭代这些文档并输出不是用户123的数组条目的简短信息。
或者,您可以使用聚合管道过滤掉数据库上的Bob条目。使用上面的$ match查询,$ unwind the friendship-array然后$匹配那些id不是123的文件。这将是一个权衡:你以节省数据服务器上的CPU负载为代价来节省带宽。
要查询友谊关系是否已存在,请使用:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();