我正在尝试Couch DB api。但是无法为它构造类结构。喜欢艺术家,如果我使用类发布将有名称和专辑字段。但是在检索它时,它将具有_id和_rev字段。现在,可以通过向艺术家类添加一个字段来处理id,但我需要_rev字段来更新文档。
现在,我怎么能用C#/ F#这样的静态类型语言呢?
如果需要进一步的信息,请告诉我。
答案 0 :(得分:3)
_id是couchdb唯一标识文档的方式。您可以设置它,或者在插入文档时,couchdb将设置一个uuid。
_rev是couchdb识别文档修订版的方法。假设您要向现有文档添加新详细信息,则必须告诉couchdb您用于更新文档的修订版本。如果对同一文档进行了其他更改,则您的更新将被拒绝。
我将使用装饰器模式实现这个:
您的域名模型将包含相册类,其中包含相册中的所有内容。您的数据访问层可以添加存储_id和_rev的装饰器。如果将文档存储到数据库,如果对象未实现couchdb_decorator,您将知道生成(或让couchdb生成)新的_id。如果实现了装饰器,您可以从中访问_id和_rev。从沙发中加载对象时,只需将其设置为装饰并包含这些详细信息即可。
答案 1 :(得分:1)
对于类似的需求(in Java),我使用了"数据访问对象"图案。
这是伪代码中的结构:
Class RESTDatabase
constructor(baseURL)
get(id): JSONObject
put(JSONObject)
delete(JSONObject)
注意:JSONObject
使用delete
,因为您需要_id
和_rev
。
在上层,您可以定义业务类,其中一些方法使用" reserved"属性,以及其他允许访问" free"属性。
例如:
Class Artist
getName(): string
getFreeAttributes(): JSONObject
。答案 2 :(得分:0)
要快速入门,您可能需要查看MyCouch - 用于.NET的异步CouchDb - https://github.com/danielwertheim/mycouch
这里有一篇入门文章(关于专辑和艺术家):http://danielwertheim.se/get-up-and-running-with-couchdb-and-c-using-mycouch-on-windows/
在Wiki中查看有关如何入门的信息,但基本上是:
using(var client = new MyCouchClient("http://localhost:5984/mydb")) {
var putJsonResponse = await client.Documents.PutAsync(...json...);
var putEntityResponse = await client.Entities.PutAsync(myEntity);
}
您只需为适合您的域的实体建模:
public class Artist
{
public string ArtistId { get; set; }
public string ArtistRev { get; set; }
public string Name { get; set; }
public Album[] Albums { get; set; }
}
public class Album
{
public string Name { get; set; }
public int Tracks { get; set; }
}
使用客户端根据上述存储模型:
var artist = new Artist
{
ArtistId = "5",
Name = "Foo bar",
Albums = new[]
{
new Album { Name = "Hello world!", Tracks = 9 }
}
};
var response = await db.Entities.PutAsync(artist);
希望它有所帮助。