在一个文档MongoDB中存储多个大型数组

时间:2015-01-18 00:19:36

标签: performance mongodb gridfs

我正在创建一个具有Tinder功能的应用程序。目前我在3个单独的集合中存储用户的喜欢,不喜欢和匹配,这些集合是这样构建的

{
  "_id" : "user1_ID",
  "matches" : [
      {
          "matchID" : "user2_ID",
          "time" : "2015-01-16 21:19:50 America/Los_Angeles"
      }
   ]
}

" _id" field保存我们正在存储的用户的ID以及" matches.matchID"字段包含特定用户已匹配的用户的ID。 " matches.time" field保存与该用户匹配的时间戳。

Likes and Dislikes系列与match系列相同,只是它们包含某个用户不喜欢或喜欢的用户的ID。


我目前遇到的问题是我需要查询所有3个集合,以确保我不会向用户发送他们已经喜欢,不喜欢或匹配的其他用户,因此合并这些会更容易将3个集合合并为一个,并将其结构如下:

{
  "_id" : "user1_ID",
  "matches" : [
        {
          "matchID" : "user2_ID",
          "time" : "2015-01-17 15:47:15 America/Los_Angeles"
        }
   ],
   "likes" : [
        {
          "likeeID" : "user3_ID",
          "time" : "2015-01-17 15:47:15 America/Los_Angeles"
        }
   ],
   "dislikes" : [
        {
          "dlikeeID" : "user4_ID",
          "time" : "2015-01-17 15:47:15 America/Los_Angeles"
        }
   ]
}

虽然这可能使查询更容易,但我担心这些数组可能会变得太大并使文档太大。

存储此数据的正确方法是什么?我已经读过gridFS有助于分解大型文档,这是可行的方法吗?如果是这样,我该怎么做呢?我对gridFS的工作方式还不太熟悉。

1 个答案:

答案 0 :(得分:2)

这是一个非常有趣的问题。虽然我想可能有不止一个解决方案,但我想特别关注一个解决方案。我会考虑只使用您所述的一份文件,但将文件中存储的数据量保持在最低限度。

例如,您可以重写您的示例并节省大量字节:

{
  "_id" : "user1_ID",
  "matches" : [
        {
          "id" : "user2_ID",
          "ts" : "1421544095534"
        }
   ],
   "likes" : [
        {
          "id" : "user3_ID",
          "ts" : "1421544095534"
        }
   ],
   "dislikes" : [
        {
          "id" : "user4_ID",
          "ts" : "1421544095534"
        }
   ]
}

通过这种方法,您可以容纳数千场比赛。我会计算最大值是多少并验证给定用户是否足够匹配。

编辑:假设每个条件输入看起来都是这样的(就使用的字符数而言):

{"id" : "user2_ID", "ts" : "1421544095534"},

这大约是44个字节。我们可以舍入到50个字节。那;大约320,000个条目,你可以在一个BSON文件中。