如何在MongoDB中建立recurency和hasMany关系?

时间:2013-05-22 06:28:49

标签: mongodb mongoose

在我的应用中有users。每个用户可能有很多朋友(其他用户)。如果用户A有朋友B,那么用户B总是有朋友A.我将不得不查询用户集合以获取用户A的所有朋友。而且我还必须使用geospacial index来进行此查询,以便从用户A获取给定半径内的用户A的所有朋友。

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

{
    created: { type: Date, default: Date.now },
    phone_number: { type: String, unique: true },
    location: { type: [Number], index: '2dsphere' },
    friends: [{ phone_number: String }]
}

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

对这种结构进行建模的最佳选择是什么?

1 个答案:

答案 0 :(得分:2)

两种方法:

加入馆藏

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

每个用户的数组

创建一个数组并将朋友的对象id推送到数组上。

创建友谊时,您需要修改两个朋友(将每个朋友推送到另一个朋友阵列)。友谊解散也是如此。

哪一个?

联接收集方法较慢,因为它需要多次查询来获取友谊数据,而不是将其与用户自己持久化(利用数据局部性)。但是,如果关系数量以无限制的方式增长,则阵列方法是不可行的。 MongoDB文件有16mb的限制,并且有一个实际上限为1000左右的项目,之后使用数组变得缓慢而且难以处理。