按CouchDB中的非键(任意)字段排序

时间:2015-12-07 14:33:36

标签: sorting couchdb

我有一个相当大的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万行?

2 个答案:

答案 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)} 
}

这就是我们的反手在生产中的设计方式。