2017-03-07 94 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

嗨@迪克森,很高兴你发现我的回答很有帮助。请记住加注和/或接受您认为有用的答案。 –