.NET(托管代码)可以读写 CouchDB 吗?
我想构建我的项目的一部分,使用 CouchDB 进行文档管理
这是一个迟到的答案,但请查看Hammock。它很活跃,很快就会在几个项目中投入生产使用,并且正在接收定期更新和修复。除了基本的对象持久性之外,Hammock 还为您提供:
Repository<>
类,有助于将您的查询/视图(即 _Design doc)与您的 c# 应用程序代码结合在一起。存储库负责维护 _design 文档,这有助于防止 CouchDB 视图感觉像存储过程。看看SharpCouch实用程序类。
它是 CouchDB HTTP API 的简单包装类。
鉴于您通常通过 REST 和 JSON 与 CouchDB 进行通信,我想使用JSON.NET和普通的 WebClient/HttpWebRequest 类来做到这一点不会太难。我自己没试过,请注意...
游戏有点晚了,但是有一个开源项目,用于在异步 HTTP 客户端上用 C# 编写的新驱动程序,默认情况下,Newtonsoft 的 JSON.Net 用于序列化(可切换)。MyCouch - 用于 .Net 的简单异步 CouchDb 客户端。
此处有一个入门帖子:http: //danielwertheim.se/get-up-and-running-with-couchdb-and-c-using-mycouch-on-windows/
密切关注Ottoman一个用 C# 编写的开源项目。它仍在大力开发中,但我想指出它是规划阶段项目的一个选择。我会在这篇文章接近完成时更新它。您可以在github上查看源代码。阅读 README 以查看示例以及当前版本的功能。
这是一个相当新的项目,但非常活跃。当然,我也有点偏激。;-)
还可以看看divan - cdb api 的轻量级包装器
我已经将 JSON.NET 与 MS REST 入门工具包的 http 客户端类结合使用以集成到 CouchDB 中,并且效果非常好。
如果您想要最新状态,CouchDB 的 wiki 有一个 C# API 列表(及其功能):http ://wiki.apache.org/couchdb/Getting_started_with_C%23
WDK10 中包含的 CouchDB 非常易于使用的 .NET API,您可以从http://code.google.com/p/skitsanoswdk/获取它非常灵活,允许您处理对象和纯 json 级别的数据。
选项(按最新更新排序):
还有一个 - CouchDBClient:https ://github.com/ttutisani/CouchDBClient
免责声明:我是作者。
我试图让 CouchDBClient 更友好地使用自定义对象——这通常是应用程序存储在数据库中的内容。
当我开始编写这个框架时,我发现并尝试过的所有其他方法都给人一种非标准化方法签名的印象(使用各种约定命名并且更难猜测它们做了什么),而不是统一的接口(一些围绕字符串文档的操作,而其他围绕 json 文档),不是很灵活(有些只使用字符串,其他只使用对象),或者不是很抽象(必须首先了解 CouchDB REST API 才能正确使用它们)。我假设并希望它们从那时起已经成熟,但至少这个设计符合我的口味。
我希望 CouchDBClient 可以创造一种舒适的抽象感,而不必过多担心底层 API,而只关注您的应用程序,以及它如何存储和检索所需的对象。
我知道我很晚了,但也许这对未来有帮助。在过去的几年里,我为 CouchDB 开发了一个库。
最大的特点是将 LINQ(类似 EF Core)转换为 mango 查询,还有 DB Changes Feed、Views 和 Table Splitting。
https://github.com/matteobortolazzo/couchdb-net
var skywalkers = await context.Rebels
.Where(r =>
r.Surname == "Skywalker" &&
(
r.Battles.All(b => b.Planet == "Naboo") ||
r.Battles.Any(b => b.Planet == "Death Star")
)
)
.OrderByDescending(r => r.Name)
.ThenByDescending(r => r.Age)
.Take(2)
.Select(
r => r.Name,
r => r.Age
})
.ToListAsync();
查看放松http://www.sharplearningcurve.com/wiki/Symbiote-Relax.ashx。Relax 是“CouchDB(优秀)RESTful API 的.Net API 抽象。它包括一个用于文档交互的基于存储库的接口和一个用于管理类型任务的服务器控制器。”
我推荐 CouchDb.Repository.Helper 包。它是全面的,允许您在 XML 文件中创建查询,并根据变量的值或对象的属性解析动态参数。
我有同样的需求,在评估了可用的选项后,为了满足我的应用程序的要求,我创建了这些对我有很大帮助的组件,也许它们可以帮助你和其他人。我明确表示我无意在这里推销自己,只是分享一些可能有用的东西。
如何配置和使用的详细说明在github上。
使用 mango-querie 检索文档的使用示例:
IList<User> users;
var sts = new List<String> { "ACTIVE", "LOCKED" };
using (UserRepository db = new UserRepository())
{
var query = db.FindOf("list-status", new { id = "OwnerIdloop.user.7", statuses = sts });
users = db.List<User>(query);
}
Array.ForEach(users.ToArray(), Console.WriteLine);
添加文档示例:
User user = createUser("email@email.com");
using (UserRepository db = new UserRepository())
{
var result = db.Insert<User>(user); // add document and return instance changed with operation revision id
Console.WriteLine(result.Revision);
}
更改文件示例:
using (UserRepository db = new UserRepository())
{
// Load document data by ID
var user = db.Get<User>("email@email.com");
user.Name = user.Name + "::CHANGED";
var result = db.Update<User>(user); // update document and return instance changed with operation revision id
Console.WriteLine(result.Revision);
}
删除文档示例:
using (UserRepository db = new UserRepository())
{
// Load document data by ID
var user = db.Get<User>("email@email.com");
var result = db.Delete<User>(user); // delete document from database. Return true case sucess or false case not deleted
Console.WriteLine($"Sucesso: {result}");
}
希望这可以帮助!