0

我有一个带有沙发数据库的简单数据库。我有用户有这些领域:

String userName
String password
String mail
boolean admin

我将我的用户保留在 db。但是我对 Couch DB 和 NoSql 很陌生。如何通过示例在其上实现 map reduce(或者它是否在内部执行并且我不需要做任何事情?)

我的应用程序使用 Spring 3 和 Ekorp。

4

2 回答 2

1

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

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

正如卢克坎贝尔在上面指出的那样,您将需要创建自己的“类型”属性来识别每个实体......例如,您可以更改“类型”属性,而不是使用管理员属性来识别具有权限的用户:

{
    type: "admin"...
}

要查询数据库并检索特定文档,您需要使用地图功能。再次,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);
    }
}

这个“查询”应该为每个用户文档打印出每个“用户”的名称和一个小的状态消息(“是管理员吗?:真(或假)”),管理员属性为布尔值。至于“reduce”函数,它们非常有用,但首先要充分理解 map 函数更为重要,因为它们用途广泛,在大多数情况下,一个写得好的 map 函数将避免编写“reduce”函数的需要...

Couch DB 有很多潜力。这个网站可能是最好的起点;http://guide.couchdb.org/index.html - 也就是说,该技术中也有一些非常奇怪的怪癖,有时会迫使您重新考虑您的数据库设计......这里简要讨论了其中一个怪癖(见维克多·尼科莱特的回答):

使用空值创建 Couch DB 视图有什么问题吗?

于 2012-08-21T09:42:47.160 回答
0

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

_类型

或者

类型_

地图功能可以是

function(doc) {
 if(doc.type_=="user") { 
   emit(doc.name,doc._id);
 }
}
于 2012-02-03T21:48:24.793 回答