如何在MongoDB中建模重复性和hasMany关系?

如何在MongoDB中建模重复性和hasMany关系?,mongodb,mongoose,Mongodb,Mongoose,在我的应用程序中有用户。每个用户可能有许多朋友(其他用户)。如果用户A有一个朋友B,那么用户B有一个朋友A-始终。例如,我将不得不查询用户集合,以获得用户的所有朋友A。在这个查询中,我还必须使用geospacial索引从用户A获取给定半径内用户A的所有朋友 我在MongoDB中尝试“建模”这个结构时遇到了一些问题。 现在我有这个(在猫鼬): 因此,每个用户都包含其他用户电话号码的数组(电话号码标识每个用户)。但我认为这不是一个好主意,因为一个用户可能有零个或多个朋友,所以朋友数组将是可变的,并且

在我的应用程序中有
用户
。每个用户可能有许多朋友(其他用户)。如果用户A有一个朋友B,那么用户B有一个朋友A-始终。例如,我将不得不查询用户集合,以获得用户的所有朋友A。在这个查询中,我还必须使用geospacial索引从用户A获取给定半径内用户A的所有朋友

我在MongoDB中尝试“建模”这个结构时遇到了一些问题。 现在我有这个(在猫鼬):

因此,每个用户都包含其他用户电话号码的数组(电话号码标识每个用户)。但我认为这不是一个好主意,因为一个用户可能有零个或多个朋友,所以朋友数组将是可变的,并且可能会显著增长

对此结构建模的最佳选择是什么?

两种方法:

加入集合 类似于关系方法,其中有一个集合,其中包含表示友谊的文档(基本上是两个对象ID和关于关系的可能元数据)

每个用户上的数组 创建一个数组并将好友的对象id推送到数组中

创建友谊时,您需要修改两个朋友(将每个朋友推送到另一个的朋友数组中)。友谊的破裂也是如此

哪一个?
连接收集方法的速度较慢,因为它需要多个查询来获取友谊数据,而不是将其持久化给用户自己(利用数据局部性)。但是,如果关系的数量以无限的方式增长,那么数组方法是不可行的。MongoDB文档有16mb的限制,实际上限是1000个左右的项目,之后使用数组会变得缓慢和笨拙。

Hmm因此,如果我假设每个用户可能有多达1000个朋友,那么我认为最好在每个用户上使用数组,对吗?但是数组格式有一个错误,您无法存储关于它的额外信息友谊。这可能是一个问题。不是真的,您可以始终在包含友谊元数据的数组中存储对象(嵌入文档)。
{
    created: { type: Date, default: Date.now },
    phone_number: { type: String, unique: true },
    location: { type: [Number], index: '2dsphere' },
    friends: [{ phone_number: String }]
}