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

Arrays Mongo DB如何处理大型数组字段?,arrays,performance,mongodb,Arrays,Performance,Mongodb,我正在尝试将ObjectID列表作为数组字段存储在文档中 我知道Mongo DB对单个文档的大小有4MB的限制。因此,考虑到ObjectId的长度是12字节,一个文档应该能够在一个数组字段中处理300000多个条目。(如果计算关闭,请告诉我) 如果数组中的条目数接近该限制,我可以期望什么样的性能?尤其是当字段被索引时?内存有问题吗 典型的查询如下所示: 按单个值查询 db.myCollection.find( { myObjectIds: ObjectId('47cc6709347

我正在尝试将ObjectID列表作为数组字段存储在文档中

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

如果数组中的条目数接近该限制,我可以期望什么样的性能?尤其是当字段被索引时?内存有问题吗


典型的查询如下所示:

按单个值查询

db.myCollection.find(
  {
    myObjectIds: ObjectId('47cc67093475061e3d95369d')
  }
);
按多个值查询

db.myCollection.find(
  {
    myObjectIds: {$in: [ObjectId('47cc67093475061e3d95369d'), ...]}
  }
);
db.myCollection.update(
  {
    _id: {$in: [ObjectId('56cc67093475061e3d95369d'), ...]}
  },
  {
    $addToSet: {myObjectIds: ObjectId('69cc67093475061e3d95369d')}
  }
);
向多个文档添加新值

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


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


这是我的待办事项清单上要调查和写博客的一件事,但我还没来得及去做。如果你这样做了,我肯定有兴趣看看你的发现是什么!同样,如果我很快开始讨论,我也会在这里发布结果。

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


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

随着mongo 2.4的发布,您可以使用capped数组。在insert时,您可以告诉mongo对数组进行$sort和$slice,以便根据您的条件将其保持为固定长度(如果您不介意丢弃数据的话)。例如,您可以使用它在数据日志中保存最近的N个条目

仅供参考:在1.8中,最大文档大小已增加到16MB,该限制是10gen施加的软限制。有人认为这是最好的:(意译)这个限制是为了迫使我们更加认真地思考我们的模式设计。@Bryan Migliorisi谢谢,我看到了这篇文章,同意在模式设计上更加聪明。我不打算做基准测试。但如果我这样做,我会在这里分享我的发现。谢谢。谢谢,我真的没有想到当达到极限时会发生什么。显然,我需要更加关注它。