我有一个相当大的CouchDB数据库(大约300万个文档)。我有各种视图函数返回无法修改的数据切片(或者至少应该只作为最后的手段修改)。
我需要能够对任意字段进行排序以进行报告。对于较小的DB,我在PHP后端返回整个对象json_parse
,然后在那里排序。但是,在我们最大的数据库上执行此操作时,我们经常会出现Out Of Memory错误。
经过一些研究,我倾向于在list function中访问排序键(通过URL参数)并在那里进行排序。这是我偷了from here的想法。摘录:
function(head, req) {
var row
var rows=[]
while(row = getRow()) {
rows.push(row)
}
rows.sort(function(a,b) {
return b.value-a.value
})
send(JSON.stringify({"rows" : rows}))
}
它似乎适用于较小的数据库,但仍需要做大量工作才能完成生产。
这是:
a)一个好的解决方案?
b)开始使用3,5或1000万行?
答案 0 :(得分:1)
您无法使用list函数将所有内容加载到内存中。因此,有了足够的数据,最终,您将获得内存不足错误,就像您使用PHP一样。
如果你能活在记忆限制之内,那么它是一个合理的解决方案,具有一些优势。
否则,请使用lucene,elasticsearch或Cloudant Search(clouseau& dreyfus)等进行调查。
答案 1 :(得分:0)
在我们的环境中,我们有超过500万条记录。沙发的设计使得每个文档都有一些特定的字段,可以将其与其他类别的文档区分开来。
例如,有数字文档,其字段为Document Document“USer”或DocumentType“XXX”
这些DocumentType字段允许我们根据不同的类别对各种文档进行排序。 因此,如果你有3百万个文档,并且你有大约10个类别,那么每个类别将有大约300万个文档。
现在您可以设计系统,以便始终传递您需要传递给Couch的DocId。这样会更快。
所以查询可以像
function(doc)
{
if(doc.DocumentType=== 'XXX' && doc._id) {emit(doc.FieldYouWant, doc._id)}
}
这就是我们的反手在生产中的设计方式。