我正在开发一个Rails应用程序,它实现了一些社交网络功能作为关系,跟随等等。到目前为止,一切都很好,直到我遇到许多关系中的问题。如您所知,mongo缺少连接,因此建议的解决方法是将关系存储为两个相关文档上的ID数组。好吧,它有点多余但它应该有效,让我们说:
field :followers, type: Array, default: []
field :following, type: Array, default: []
def follow!(who)
self.followers << who.id
who.following << self.id
self.save
who.save
end
这很好用,但这是我们需要交易的情况之一,呃,但是mongo不支持交易。如果将ID添加到“关注”关注者列表但未添加到“关注者”列表后该怎么办?我的意思是,如果第一个文档被正确修改但第二个文档由于某种原因无法更新。
也许我太悲观了,但没有更好的解决方案?
答案 0 :(得分:0)
我建议只在一个方向存储关系,将用户在其用户文档中跟随的用户存储为“跟随”。然后,如果您需要查询用户U1的所有关注者,您可以查询{users.following : "U1"}
因为您可以在数组上拥有多键索引,所以如果您为此字段编制索引,此查询将会很快。
仅朝这个方向前进的另一个原因是单个用户对他们可能关注的用户数量有实际限制。但是,真正受欢迎的用户可能拥有的关注者数量可能接近系统中的用户总数。您希望避免在文档中创建可能很大的数组。