2015-02-09 36 views
0

寫蒙戈當我得到這個錯誤:MongoDB的,Python和PyMongo:文檔大小與BSONObj尺寸過大是無效

OperationalFailure caught 
10334 
{u'connectionId': 2365, u'code': 10334, u'ok': 1.0, u'err': u'BSONObj size: 17254820 (0xA4490701) is invalid. Size must be between 0 and 16793600(16MB) First element: 0: 

這是一個正常的文件全字符串和整數的,在Python構造,但它的大小似乎是17,25MB。你會怎麼做?

這是數據看起來的樣子:

{ date: new Date(1417996800000), 
    visitors: [ { owner: "AS3320 Deutsche Telekom AG", ip: "82.148.15.23", views: 844 }, 
       { owner: "AS29314 VECTRA S.A.", ip: "173.235.42.25", views: 458 }, 
       ... 
      ] 
} 

有數組中很多很多的元素,但我很奇怪的量超過16MB。

限制數組的大小降到8500元后,我得到這個PyMongo錯誤:

$ operator made object too large 
+0

你可以正常化一點嗎?也許80%的數據在20%的字段中。然後你可以將其中的幾個移動到他們自己的收藏中。 – 2015-02-09 13:16:50

+0

我更新了我的問題以適合您的問題。擁有所有頁面印象將會很好,但是可以想象當數組超過一定長度或大小時就可以切割數組。使用GridFS似乎很複雜? – nottinhill 2015-02-09 13:25:03

+0

在寫入Mongo之前,有沒有辦法確定python或json對象中列表的物理大小? – nottinhill 2015-02-09 13:50:13

回答

2

在設計Mongo模式時有很多事情需要考慮,但通常架構應該反映您如何使用數據。 MongoDB博客上的6 Rules of Thumb for MongoDB Schema Design文章系列是一個好的開始。

我首先想到的是把你的文件「內而外」,並存儲這種類型的文檔集合中:

{ date: new Date(1417996800000), owner: "AS3320 Deutsche Telekom AG", ip: "82.148.15.23", views: 844 }, 
{ date: new Date(1417996800000), owner: "AS29314 VECTRA S.A.", ip: "173.235.42.25", views: 458 }, 
... 

這樣,你不限制多少獨立用戶,每天可以有。如果您在date字段上編制索引,則通過日期查找訪問者仍然有效。

如果您沒有使用owner字段,也許它也可以移到自己的集合中。

{ ip: "82.148.15.23", owner: "AS3320 Deutsche Telekom AG"}, 
{ ip: "173.235.42.25", owner: "AS29314 VECTRA S.A."}, 
... 

顯然不是一個明確的答案,但它可能是一個開始。

關於在編寫文檔之前檢查文檔的大小(我認爲這不是解決糟糕的模式設計的好方法)。數據爲BSON通過MongoDB的內部處理的,所以你可以使用bson module

import bson 
len(bson.dumps(my_document)) 

如果你得到了「操作者進行對象過大」的錯誤,請參閱this question

+2

Apreciate它。這是大數據,所以我採用更平坦的模式。 – nottinhill 2015-02-10 20:35:24