2017-04-06 146 views
0

当我尝试从mongodb集合中获取数据时,出现以下异常。这个集合有非常大的数据。Java与mongodb

唯一的例外是:

com.mongodb.MongoQueryException: Query failed with error code 10334 and error message 'BSONObj size: 24020168 (0x16E84C8) is invalid. Size must be between 0 and 16793600(16MB)' on server 10.15.0.227:27017 

而下面是我的查询这是我用来从MongoDB中获取数据:

db.getCollection('triggered_policies').aggregate(
[{ "$match" : { "policy_name" : "EIQSOC-1040-ec"}}, 
{ "$project" : { "cust_created_at" : { "$add" : [ "$created_at" , 19800000]} , "event_ids" : "$event_ids" , "trigger_time" : "$trigger_time" , "created_at" : "$created_at" , "triggered_rules" : "$triggered_rules"}}, 
{ "$sort" : { "created_at" : -1}}, 
{ "$group" : 
    { "_id" : 
     { 
      "$hour" : "$cust_created_at"} , 
      "triggered_policies" : { "$addToSet" : { "trigger_time" : "$trigger_time" , "created_at" : "$created_at" , "event_ids" : "$event_ids" , "triggered_rules" : "$triggered_rules"} 
     } 
    } 
}, 
{ "$sort" : { "_id" : 1}} 
]) 

下面是我们得到的确切异常:

Error: getMore command failed: { 
    "ok" : 0, 
    "errmsg" : "BSONObj size: 25994482 (0x18CA4F2) is invalid. Size must be between 0 and 16793600(16MB)", 
    "code" : 10334 
} 

请帮助我们解决问题。

回答

0

看起来像聚合过程中创建的文档超过了mongo db中的16MB大小限制。您可能必须更改聚合查询,以便不会将太多数据累积到超过16MB大小限制的单个文档中。

下面是蒙戈DB文档报价:

BSON文档大小 最大BSON文件大小为16兆字节。 最大文档大小有助于确保单个文档不能使用过量的RAM,或者在传输过程中使用过多的带宽。为了存储大于最大大小的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参阅mongofiles和您的驱动程序的文档。

+0

在created_at上定义索引应该有助于减少聚合过程中操纵的数据大小。 –

+0

谢谢JayKrish的快速回复。 但帮我准备那种查询。 –

+0

问题出在$ group,因为您使用$ addToSet,它会将所有唯一数据添加到数组并增加文档大小。相反,尝试从这些文档中只获取所需的值。 – JayKrish