0

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-查询结果的格式不是我想要的。它将是文档行,而不是具有文档对象数组的类别行。

4

2 回答 2

1

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

{
    _id: ...,
    name: ...,
    type: ...,
    category: 1,
    position: 1
}
于 2012-08-21T16:20:52.290 回答
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 } },
  ...
]
于 2012-08-22T07:46:05.340 回答