如何在 C# 中的 couchbase 数据库中检索 keys/documents 的列表

How to retrieve a list of keys/documents in couchbase database in C#

我对 couchbase 完全陌生。

这是我用于插入和获取文档的示例代码:

using (var bucket = Cluster.OpenBucket())
{
    var document = new Document<dynamic>
    {
        Id = "Hello",
        Content = new
        {
            name = "Couchbase"
        }
    };

    var upsert = bucket.Upsert(document);
    if (upsert.Success)
    {
        var get = bucket.GetDocument<dynamic>(document.Id);
        document = get.Document;
        var msg = string.Format("{0} {1}!", document.Id, document.Content.name);
        Console.WriteLine(msg);
    }

    Console.Read();
}

但我不知道如何检索存储的文档列表。

要找到符合条件的密钥,可以在其他回复中看到视图(以及即将推出的 N1QL)。

另一个用例是,有一个键列表,无需使用循环即可检索相应的文档:

在桶上,可以使用IDictionary<string, IOperationResult<T>> Get<T>(IList<string> keys)方法。它需要您想要获取的键列表和字典中每个键 returns 一个 IOperationResult,您可以像使用示例中的 "get" 变量一样使用每个键。

在线下,这使用 TPL,因此您无需处理并行性,但您可以在覆盖中提供并行性设置。

Here 是一些关于使用 2.0 .Net SDK 进行批量操作的文档。应该是相关的,即使这是 BETA 的文档。

注意:视图的用法通常会为您提供索引的 ID/内容,以及相关文档,因此在使用视图时,您甚至不必进行批量获取。

到目前为止,在 Couchbase 中有两种不同的方式来查询文档 content:using Views or using N1QL 查询语言(名为 nickel,目前处于开发者预览 3 状态)。

观看次数

Couchbase Views creates indexes based on the content of JSON documents stored in the database and are written using MapReduce 编程模型。 Couchbase 使用 MapReduce 跨集群处理文档并根据其内容创建索引。 视图是一个 JavaScript 函数,它在数据集中的每个项目上执行,进行一些初始处理和过滤,然后将转换后的结果输出为 key-value 集。

下图告诉你什么是结构视图:

例如,假设您有一个名为 test 的存储桶,并且您想要存储具有以下结构的文档:

public  class User
    {
        [JsonProperty("user_id")]
        public string UserId { get; set; }

        [JsonProperty("fname")]
        public string FirstName { get; set; }
         
        [JsonProperty("age")]
         public string Age { get; set; }

        [JsonProperty("email")]
        public string Email { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }
}

现在,假设您要查找所有 25 岁的用户,并且想知道他们的姓名和电子邮件。你的观点可能是这样的:

function(doc, meta) { 
    if (doc.type == "user" && doc.age == 25) { 
        emit(doc.user_id, [doc.fname, doc.email]); 
    } 
}

如果将此视图另存为 设计文档名称 = dev_user 和 视图名称=userswith25 的开发视图,您可以通过这种方式在您的代码中使用此视图:

var query = bucket.CreateQuery("dev_user", "userswith25");
var result = bucket.Query<dynamic>(query);

如果您想了解有关视图的更多信息,请观看此视频:Views and Indexing for Couchbase 3.0

N1QL

N1QL(发音为“nickel”)是 Couchbase 的 next-generation 查询语言。 N1QL旨在满足分布式document-oriented数据库的查询需求。 N1QL 中的一个简单查询包含三个部分:

  • SELECT - return
  • 的部分文档
  • FROM - 要使用的数据桶或数据存储
  • WHERE - 文档必须满足的条件

查询中只需要一个 SELECT 子句。通配符 * 选择文档的所有部分。查询可以 return 不同文档结构或片段的集合。但是,它们都会匹配 WHERE 子句中的条件。

正如我之前所说,N1QL 处于开发者预览状态,因此尚未与 Couchbase 集成。 [编辑: The .NET SDK N1QL integration no longer appears to be in alpha. ] 要使用它,您需要下载它并将其与您的 Couchbase 服务器集成。按照前面的视图示例,我将向您展示一个用于搜索具有相同条件的用户的查询:

var query = "SELECT fname, email FROM test WHERE type = 'user' and age = 25";
var result = bucket.Query<dynamic>(query);

在开发 N1QL 的同时,Coushbase 正在开发一个 Language Integrated Query (LINQ) provider 用于使用 Couchbase .NET SDK 通过 N1QL 查询 Couchbase 服务器。这将为 N1QL 带来熟悉的 LINQ 语法,并将结果映射到 POCO。下面我展示了一个示例,说明您将来可以如何使用它:

using (var cluster = new Cluster())
        {
            using (var bucket = cluster.OpenBucket("test"))
            {
                var users = from c in bucket.Queryable<User>()
                            where c.Age==25
                            select c;

                foreach (var user in users)
                {
                    Console.WriteLine("\tName={0}, Age={1}, Email={2}",
                        user.FirstName,
                        user.Age,
                        user.Email
                        );
                }
            }
        }

此外,还有其他变体:

  • Telerik 创建了一个 Linq Provider for Couchbase,我还没有使用过,但我认为它基于 Couchbase .NET SDK 1.3,而不是您正在使用的 2.0 版本。
  • 你可以整合Couchbase with Elasticsearch to provide full-text search in your application using the open source search engine, Elasticsearch. With this combination you can save your documents in Couchbase and search them later using Elasticsearch. For that, you can use this elasticsearch .net client

希望这对您有所帮助。

我也同意西蒙的看法。查看找到密钥或 N1QL。如果您还没有设置或与 N1QL 交互,它是一种非常强大的语言,可以在此处找到教程:

http://docs.couchbase.com/developer/n1ql-dp3/n1ql-intro.html

请注意,N1QL 是一种查询语言,需要与视图配合使用才能从 couchbase 服务器扫描和检索所有密钥。 N1QL 允许您在数据集上创建主索引(使用视图),然后将该索引用于 运行 您的查询。

安装并设置 N1QL 后,以下示例查询将在 couchbase 服务器上创建视图 index/primary 索引

Create primary index on bucket;

创建索引后,您就可以从服务器检索所有键。

*select * from bucket;

在内部,查询引擎将使用 view/primary 索引获取服务器的键列表(全桶扫描),然后使用该列表检索值。

N1QL 开发者预览版必须使用视图。您的 create index 语法是准确的,但 Couchbase 4.0 还引入了二级索引以及动态扩展查询和索引功能的能力。当这种情况发生时,称为 "Multi-Dimensional Scaling",N1QL 应该默认将新索引作为主要索引方案,并且比视图快得多。

可以在此处阅读有关多维缩放的更多信息:

http://www.couchbase.com/coming-in-couchbase-server-4-0