Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails MongoDB-为统计信息筛选和计数大型集合_Ruby On Rails_Mongodb_Mongoid - Fatal编程技术网

Ruby on rails MongoDB-为统计信息筛选和计数大型集合

Ruby on rails MongoDB-为统计信息筛选和计数大型集合,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我正在使用Mongoid和Rails。我有一个名为“数据集”的集合,其中包含大约600000个文档。每个数据集中都有一个键“文件”,可能存在,也可能不存在。在文件内部有一个对象(文件)数组。我需要获取所有包含文件的数据集,然后获取这些数据集中所有文件的计数。这就是我所拥有的,但它抛出了一个错误,说它超过了最大文档大小: total = Dataset.collection.aggregate([ { '$project' => { files: 1 }}, { '$unwind'

我正在使用Mongoid和Rails。我有一个名为“数据集”的集合,其中包含大约600000个文档。每个数据集中都有一个键“文件”,可能存在,也可能不存在。在文件内部有一个对象(文件)数组。我需要获取所有包含文件的数据集,然后获取这些数据集中所有文件的计数。这就是我所拥有的,但它抛出了一个错误,说它超过了最大文档大小:

total = Dataset.collection.aggregate([
  { '$project' => { files: 1 }},
  { '$unwind' => '$files' },
  { '$group' => {_id: "$_id", count: {'$sum' => 1} } }
])
我可以使用以下方法使其工作,但速度太慢,根本没有使用db的功率:

datasets_with_files = Dataset.where(:files.exists => true)

count = 0
datasets_with_files.each do |dataset|
  count += dataset.files.count
end

count
所以基本上我需要知道A.最好的查询类型是什么,B.如果聚合是最好的方法,那么如何处理超过最大大小的文档,这样我就可以执行这样的查询

解决方案:

我不需要使用光标或磁盘就可以工作:

Dataset.collection.aggregate([
  { '$match' => { files: { '$exists' => true }}},
  { '$unwind' => '$files' },
  { '$group' => { _id: nil, total_files: { '$sum' => 1 }}}
])[0]['total_files']

您可以使用直接投影数组字段的大小,因此在shell中,您可以按以下方式执行此操作:

db.test.aggregate([
    {$match: {files: {$exists: true}}},
    {$project: {count: {$size: '$files'}}}
])
在Ruby中,它看起来像:

@coll.aggregate([
  { '$match' => { files: { '$exists' => true } } },
  { '$project' => { count: { '$size' => '$files' } } }
])
包括
光标
选项以克服结果上的16MB大小限制:

@coll.aggregate([
  { '$match' => { files: { '$exists' => true } } },
  { '$project' => { count: { '$size' => '$files' } } }
], cursor: {})

非常感谢你的帮助。问题是,当我运行聚合查询时,它会抛出文档大小错误:未捕获异常:聚合失败:{“errmsg”:“异常:聚合结果超过最大文档大小(16MB)”,“代码”:16389,“确定”:0}您知道如何处理类似的问题吗?再次感谢。@sturoid只要您使用的是MongoDB 2.6.x,您就可以设置光标选项以克服16MB的限制。看最新消息,太棒了。我试了最后一个,但我得到:异常:无法识别的管道阶段名称:'cursor'是否与我的Mongoid版本有关?我的机器上有mongo 2.6.7。@sturoid请确保
游标
对象作为单独的参数传递,而不是管道数组的一部分。很抱歉,我复制并粘贴了您的内容,但它仍会抛出该错误。你知道为什么会这样吗?