在couchdb中显示所有1M两次排序?

时间:2012-08-21 13:36:29

标签: couchdb

对couchdb新手,我想与排序做一对多的关系

类别 - >文件

想要对每个类别中的类别和排序文档进行排序,并希望将结果作为数组。

我可以按类别或按文件排序,但不能同时排序。

我希望得到类似这样的查询结果:

[{  name: 'category1',
    position: 1,
    type: 'category',
    documents: [{ name: ..., type: ..., position: 1 },
                { name: ..., type: ..., position: 2 },
                { name: ..., type: ..., position: 3 }
 }
 {  name: 'category2',
    position: 2,
    type: 'category',
    documents: [{ name: ..., type ..position: 1 },
            { name: ..., position: 2 },
            { name: ..., position: 3 }]
 }]

我设置了一个视图设计和地图函数(这是正确的方法吗?):

function(category) { 
  if (type == 'category') {
      for (var d in category.documents) {
          emit([category.position, category.documents[d].position??? ], {_id: category.documents[d], category: category })
      }
  }

问题是......

1- category.documents [d] .position不会“存在”,所以我不能简单地这样做。

2-查询结果没有按照我想要的方式格式化。它将是文档行,而不是带有文档对象数组的类行。

2 个答案:

答案 0 :(得分:1)

CouchDB中没有任何关系。正确的方法是直接在文档上设置文档所属的类别。

{
    _id: ...,
    name: ...,
    type: ...,
    category: 1,
    position: 1
}

答案 1 :(得分:1)

正如@OctavianDamiean所指出的,您应该在文档中添加一个类别字段。然后map函数就变成了:

function(doc) {
  if (doc.type === 'Document') {
    emit([doc.category, doc.position], 1);
  }
}

使用include_docs=true查询,您将获得:

[ { "key": ["category1", 1], "doc": { "name": "doc1.1", "type": "Document", "position": 1 } },
  { "key": ["category1", 2], "doc": { "name": "doc1.2", "type": "Document", "position": 2 } },
  { "key": ["category2", 1], "doc": { "name": "doc2.1", "type": "Document", "position": 1 } },
  { "key": ["category2", 2], "doc": { "name": "doc2.2", "type": "Document", "position": 2 } },
  ...
]