Map Reduce Couch Db

时间:2011-10-12 13:45:02

标签: java spring nosql mapreduce ektorp

我有一个带数据库db的简单数据库。我有用户拥有该字段:

String userName
String password
String mail
boolean admin

我将用户留在db。但是我对Couch DB和NoSql这么新。如何通过示例实现map reduce(或者它是否在内部执行,我不需要做任何事情?)

我将Spring 3和Ekorp用于我的应用程序。

2 个答案:

答案 0 :(得分:1)

您的问题可以使用更多细节,但据我了解,您希望创建一个像用户“表”一样的Couch DB文档。为此,您需要在Couch DB上创建一个JSON文档,其中包含以下属性:

{
    type: "user",
    username: "John",
    password: "*****",
    mail: "blah, blah, blah",
    admin: true
}

就像上面提到的lukecampbell一样,你需要创建自己的“type”属性来识别每个实体...例如,你可以改变“你可以改变”,而不是使用admin属性来识别具有权限的用户。输入“property:

{
    type: "admin"...
}

要查询数据库并检索特定文档,您需要使用map函数。 再一次,lukecampbell的例子提供了一个很好的起点:

function(doc){
    if(doc.type == "user"){ 
        emit(doc.name, doc);
    }
}

此“查询”将为您提供“每个”用户“实体文档的”视图“,按”doc.name“排序。在这里,Couch DB的美丽变得明显...... Map(和reduce)函数就像在某种意义上的SQL查询一样......但是因为它们是用JavaScript编写的,所以你可以使用JavaScript逻辑来塑造你的数据库:

function(doc){
     if(doc.type == "user" && doc.name == "John"){ 
         emit(doc.name, doc);
     }
}

这将为您提供用户姓名为John的每个“用户”文档的视图。 正如您所看到的,在某些情况下,以这种方式编写查询可能比SQL更具表现力......甚至可以以这种方式“躲避”类型的文档字段;

function(doc){
    if(
        doc.type == "user" && 
        typeof doc.admin == "boolean"
    ){ 
        emit(doc.name, "Is Admin?: " + JSON.stringify(doc.admin);
    }
}

此“查询”应为每个用户文档打印出每个“用户”的名称和一个小状态消息(“是管理员?:真(或假)”),并为admin属性提供布尔值。至于“Reduce”函数,它们非常有用,但是首先完全理解map函数更为重要,因为它们非常通用,并且在大多数情况下,编写良好的map函数将不需要编写“reduce”函数...

Couch DB有潜力。这个网站可能是最好的起点; http://guide.couchdb.org/index.html - 也就是说,技术中也存在一些非常奇怪的怪癖,偶尔会迫使你重新思考你的数据库设计......其中一个怪癖会在这里简要讨论(参见Victor Nicollet的回答):

Is there anything wrong with creating Couch DB views with null values?

答案 1 :(得分:0)

在沙发上, 在文档中添加一个名为

的字段

type

输入_p>

地图功能可以是

function(doc) {
 if(doc.type_=="user") { 
   emit(doc.name,doc._id);
 }
}