问题 Mongo DB如何处理大型数组字段?


我试图将一个ObjectIds列表作为数组字段存储在文档中。

我知道Mongo DB对单个文档有4MB的大小限制。因此,考虑到ObjectId的长度为12个字节,文档应该能够在一个数组字段中处理超过300,000个条目。 (如果计算结束,请告诉我)。

如果数组中的条目数接近该限制,我可以期待什么样的性能?特别是当该领域被索引?有内存问题吗?


典型的查询如下所示:

按单个值查询

db.myCollection.find(
  {
    myObjectIds: ObjectId('47cc67093475061e3d95369d')
  }
);

按多个值查询

db.myCollection.find(
  {
    myObjectIds: {$in: [ObjectId('47cc67093475061e3d95369d'), ...]}
  }
);

为多个文档添加新值

db.myCollection.update(
  {
    _id: {$in: [ObjectId('56cc67093475061e3d95369d'), ...]}
  },
  {
    $addToSet: {myObjectIds: ObjectId('69cc67093475061e3d95369d')}
  }
);



11336
2018-03-15 07:30


起源

仅供参考:在1.8中,最大文档大小已增加到16MB,此限制是10gen施加的软限制。有人在SO上说得最好:(释义)限制措施已经到位,迫使我们对我们的架构设计稍微思考一下。 - Bryan Migliorisi
@Bryan Migliorisi谢谢,我遇到过那篇文章并同意更聪明的架构设计。 - Jaepil


答案:


TBH,我认为你能做的最好的事情就是对它进行基准测试。创建一些虚拟数据,并在增加数组中的项目数时测试性能。在您的环境中敲响测试可能会更快 - 而不是在这里等待答案

在我的TODO列表上调查和博客是一回事,但我还没有完成它。如果你这样做,我肯定有兴趣看看你的发现是什么!同样,如果我很快就能完成它,我也会在这里发布结果。


5
2018-03-15 10:53



不打算做基准测试。但如果我这样做,我会在这里分享我的发现。谢谢。 - Jaepil


随着mongo 2.4的发布,你可以使用上限数组。在插入时,您可以告诉mongo $ sort和$ slice数组,以根据您的条件将其保持固定长度(如果您不关心丢弃数据)。例如,您可以使用它来保存数据日志中的最新N个条目。


5
2018-05-05 21:02





除非您使用,否则在达到文档大小限制时不会注意到 getLastError 每次更新后。更新将失败,并将消息记录到数据库日志中。我有来自我当地的操作人员的轶事证据表明,当有很多更新由于达到文件大小而失败时,Mongo似乎正在努力工作。

我知道除了围绕它设计之外,没有简单的方法可以避免它。据我所知,没有办法有条不紊地推到列表。我在这里看到了其他问题,人们一直试图建立固定大小的列表,但是没有找到好的解决方案。


2
2018-03-15 14:04



谢谢,我并没有真正想到达到限制时会发生什么。显然我需要更加关注它。 - Jaepil