通过父键和子键查询

时间:2014-01-23 11:21:51

标签: javascript couchdb

我在文档中有这个结构:

{
    "_id": "a04ecdc29276760e689dd8148d000e7c",
    "type": "user",
    "user": "xxx",
    "categories": [
        {
            "type": "TYPE1",
            "id": "3523683f7930be3a2e5c8496c800083a"
        },
        {
            "type": "TYPE2",
            "id": "bd2098d428d36ffd895f37b872000951"
        }
    ]
}

现在,我希望(最好)在一个查询中获取用户和他/她的相关类别,其id是对其他文档的引用,因此include_docs,按用户和类别类型进行过滤。我做到了这一点:

function (doc) {
    if (doc.type === "user") {
        emit(doc.user, null);
        if (doc.categories) {
            for (var i = 0, child; child = doc.categories[i]; ++i) {
                emit(child.type, {_id: child.id});
            }
        }
    }
}

我可以使用http get:

运行它
http://localhost:5984/_design/foo/_view/by_user?startkey=["xxx"]&endkey["xxx",{}]&include_docs=true

将为我提供用户和相关类别,而不考虑类别类型。

我如何查询用户和类别类型作为关键参数?我知道我可以为每个类别类型创建一个视图并发出([doc.user,doc.TYPE]),但看到类别是动态创建的,这可能不是一个选项。

这可以通过一个查询来完成吗?

1 个答案:

答案 0 :(得分:0)

您的密钥也可以是任意JSON。将您的发射更改为:

emit([doc.user, child.type], ...)

然后你的星空将是:

["xxx", "TYPE1"]

和endkey:

["xxx", "TYPE1", {}]