使用视图模拟动态参数

时间:2011-04-08 14:49:25

标签: couchdb

考虑以下文档结构......

{
    _id,
    _rev,
    postTitle,
    postBody
}

我正在编写一个小nodeJS weblog应用程序,我希望我的URL能够反映帖子标题。例如/WebLog/Posts/View/Hello-World/

由于无法在除了_id属性之外的任何内容上查询CouchDB,为每个帖子创建一个视图是否有意义,以便将postTitle映射到_id

您如何查询除_id以外的其他文档属性?

......我应该放弃并使用MongoDB或MySQL吗?我对CouchDB的要求太高了吗?

3 个答案:

答案 0 :(得分:1)

视图是如何在CouchDB中创建索引的。要按postTitle获取文档,请使用视图,其中的键为postTitle,并使用key=<title>includedocs=true进行查询。

{
    "views": {
        "by-post-title": {
            "map": "function(doc) { emit(doc.postTitle, null); }"
        }
    }
}

查询:GET /<db>/_design/<design>/_view/by-post-title?includedocs=true&key="Hello-World"

详细了解CouchDB views上的CouchDB Wiki

答案 1 :(得分:1)

你已经部分回答了自己的问题,但是你会创建一个视图,正如之前的回答者所提到的那样。

"views": {
    "by-post-title": {
        "map": "function(doc) { 
            if(doc.postTitle){
                var titleURL = postTitle.split(" ").join("_");
                emit(doc.titleURL, {"body" : doc.postBody, "title": doc.postTitle);
            }

        }"
    }
}

现在, http://yourcouchdb:yourport/yourdb/_design/by-post-title/_view/by-post-title?key=“Hello_World”会返回你的postBody和postTitle。

由于您的文档可以包含其他键:值,因此最好不要将整个doc作为emit调用中的第二个参数返回。

答案 2 :(得分:0)

请不要对每个帖子进行查看,这听起来很痛苦。但是,您可以使用Django(使用Couchdb)或Couchapp,并且两者都具有良好的URL重写功能。另外,请在couchone网站上查看:

couchdb rewrites in 0.11