2017-03-07 88 views
0

我想將票證詳細信息存儲在mongo文檔的數組中。它工作正常,直到文件大小達到16MB,然後我得到異常(更新後的結果文件大於16777216),並突然終止程序。我不能分割這個文件因爲它存儲了在2016年下的所有票據細節。mongo文檔中的BSON文檔大小超過16 MB

這裏是我的文檔結構。

{ 
    year:2016, 
    purpose: ticketdetail, 
    tickets:[ 
    {ticketid:001, desc:"xyz", created:20161231}, 
    {ticketid:002, desc:"xyz", created:20161231}, 
    {ticketid:003, desc:"xyz", created:20161231}, 
    ....... 
    ....... 
    {ticketid:00N, desc:"xyz", created:20161231}, 
    }]  
} 
+0

您可以將2016文檔分爲每個月的文檔,不是嗎? – Veeram

+0

@Veeram:這是每年的數據,我將存儲屬於相應年份的門票,同樣也是我每月和每天的門票。任何想法沒有拆分文件? – Dickson

+0

@Dickson你只需要以某種方式分割文檔。 16MB的限制是(現在至少)不是可選的。 –

回答

0

您將需要將文檔拆分爲單獨的文檔,可能在不同的集合中。我會不是推薦GridFS,因爲你不能查詢GridFS blob內的數據。

這裏有一個建議文檔結構:

{ 
    _id: ObjectId("85bf0ef0b9692c0010978359"), 
    "ticketid" : "001", 
    "desc" : "xyz", 
    "created" : ISODate("2016-12-31T00:00:00.000Z") 
} 
, 
{ 
    _id: ObjectId("85bed4257726f90010d4e21f"), 
    "ticketid" : "002", 
    "desc" : "xyz", 
    "created" : ISODate("2016-12-31T00:00:00.000Z") 
} 

這種結構上的注意事項:

  1. 每張票是在不同的文檔 - 這使得可擴展的,因爲對數量沒有限制集合中的文檔。
  2. 「已創建」字段現在位於適當的日期字段中。這爲您提供更準確的可查詢性。
  3. 你說你的原始文件是需要存儲2016年的所有門票。對這個新集合的適當查詢將返回2016年的所有門票,所以你不需要需要將它們全部存儲在單個文檔中:
db.tickets.find({ 
    "created" : { 
      $gte: ISODate("2016-01-01"), 
      $lt: ISODate("2017-01-01") 
     } 
    } 
}); 
+0

謝謝,我分割了我的文檔,現在可以了! – Dickson

+0

嗨@迪克森,很高興你發現我的回答很有幫助。請記住加註和/或接受您認爲有用的答案。 –