我正在尝试将一个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')}
}
);
答案 0 :(得分:5)
在我的TODO列表上进行调查和博客是一回事,但我还没有完成它。如果你这样做,我肯定有兴趣看看你的发现是什么!同样,如果我很快就能完成它,我也会在这里发布结果。
答案 1 :(得分:5)
随着mongo 2.4的发布,您可以使用上限数组。在插入时,您可以告诉mongo $ sort和$ slice数组,以根据您的条件将其保持固定长度(如果您不关心丢弃数据)。例如,您可以使用它来保存数据日志中的最新N个条目。
答案 2 :(得分:2)
除非在每次更新后使用getLastError
,否则在达到文档大小限制时不会注意到。更新将失败,并将消息记录到数据库日志中。我从我当地的操作人员那里得到了轶事证据,当有很多更新由于达到文档大小而失败时,Mongo似乎正在努力工作。
我知道除了围绕它设计之外,没有简单的方法可以避免它。据我所知,没有办法有条件地推到列表。我在这里看到了其他问题,人们一直试图建立固定大小的列表,但是没有找到好的解决方案。