根据嵌套子文档中的值过滤couchdb文档

时间:2017-09-29 06:33:55

标签: couchdb pouchdb

我想创建一个map / reduce函数,它根据子文档中的嵌套值过滤文档。但是检索父文档。

我有以下文件:

{
   "_id": "1",
   "_rev": "1-991baf1d86435a73a3460335cc19063c",
   "configuration_id": "225f9d47-841c-43c2-90c2-e65bb49083d3",
   "name": "test",
   "image": "",
   "type": "A",
   "created": "",
   "updated": 1,
   "destroyed": ""
}

{
   "_id": "225f9d47-841c-43c2-90c2-e65bb49083d3",
   "_rev": "1-3e3a1c357c86cbd1cd42b5980b9655a4",
   "configuration_packages_id": "cd19b0ba-157d-4dd4-adac-56fd470bfed4",
   "configuration_distribution_id": "5b538411-ca99-46c7-ac3c-1f382e4577a9",
   "type": "CONFIGURATION",
   "configuration": {
       "hostname": "example123",
       "images": [
           "image1",
           "image2"
       ]
   }
}

现在我想检索所有类型为A的文档,并使用hostname example123。

目前我检索所有类型A的文档:

function (doc) {
            if (doc.type === "A") {
                emit([doc.updated], doc);
            }
        }

但是现在我也想过滤主机名。 我不确定如何使用CouchDB实现这一目标。

1 个答案:

答案 0 :(得分:3)

TLDR;

你不能这样做

详细

你的"嵌套"文档只能通过联接访问,但您无法查询。

本地执行此类查询的正确方法是在父文档中包含一个真正的嵌套文档。分离这些文件需要付出代价。

加入示例

function (doc) {
    if (doc.type === "A") {
        emit([doc.updated,0]);
        emit([doc.updated,1],["_id":doc.configuration_id]);
    }
}

如果使用" include_docs = true"查询视图,这将获得链接的配置文档以及父文档本身。然后,您可以查询以获取更新的文档,将嵌套(1)与父项(0)合并并过滤它们。