我有一个带有沙发数据库的简单数据库。我有用户有这些领域:
String userName
String password
String mail
boolean admin
我将我的用户保留在 db。但是我对 Couch DB 和 NoSql 很陌生。如何通过示例在其上实现 map reduce(或者它是否在内部执行并且我不需要做任何事情?)
我的应用程序使用 Spring 3 和 Ekorp。
您的问题可以使用更多细节,但据我了解,您希望创建一个类似于用户“表”的 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 - 也就是说,该技术中也有一些非常奇怪的怪癖,有时会迫使您重新考虑您的数据库设计......这里简要讨论了其中一个怪癖(见维克多·尼科莱特的回答):
在沙发上,在您的文档中添加一个名为
_类型
或者
类型_
地图功能可以是
function(doc) {
if(doc.type_=="user") {
emit(doc.name,doc._id);
}
}