【问题标题】:How to retrieve a list of keys/documents in couchbase database in C#如何在 C# 中检索 couchbase 数据库中的键/文档列表
【发布时间】:2015-03-03 06:30:51
【问题描述】:

我对 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();
}

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

【问题讨论】:

  • 您想获取数据库中所有键/文档的详尽列表吗?或者您想知道如何在已有键列表的情况下在一次操作中检索多个文档?
  • 我想知道如何检索几个文档。例如获取注册用户列表或获取年龄超过 25 岁的用户列表。我还需要检索每个密钥。
  • 好的,如果您事先不知道密钥,您正在寻找的是views。你必须自己建造它们。 Joonas 评论指出了如何构建一个只返回数据库中所有文档的视图的答案。请注意,(很快?)将有一种类似于 couchbase 中的 SQL 的查询语言(查找 N1QL)...

标签: c# couchbase


【解决方案1】:

到目前为止,在 Couchbase 中查询文档内容有两种不同的方式:使用 Views 或使用 N1QL 查询语言(名为镍,目前处于开发者预览版 3 状态)。

观看次数

Couchbase Views 根据存储在数据库中的 JSON 文档的内容创建索引,并使用MapReduce 编程模型编写。 Couchbase 使用 MapReduce 跨集群处理文档并根据其内容创建索引。 视图是一个 JavaScript 函数,它在数据集中的每个项目上执行,进行一些初始处理和过滤,然后将转换后的结果作为键值集输出。

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

例如,假设您有一个名为 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]); 
    } 
}

如果您将此视图保存为开发视图,其中 Design Document Name= dev_user 和 View Name=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 的下一代查询语言。 N1QL 旨在满足分布式文档型数据库的查询需求。 N1QL 中的一个简单查询包含三个部分:

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

查询中只需要SELECT 子句。通配符* 选择文档的所有部分。查询可以返回不同文档结构或片段的集合。但是,它们都会匹配 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
                        );
                }
            }
        }

此外,还有其他变体:

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      要查找符合条件的键,可以在其他响应中看到视图(以及即将推出的 N1QL)。

      另一个用例是,有一个键列表,在不使用循环的情况下检索相应的文档:

      在存储桶上,您可以使用IDictionary&lt;string, IOperationResult&lt;T&gt;&gt; Get&lt;T&gt;(IList&lt;string&gt; keys) 方法。它获取您想要获取的键列表,并为字典中的每个键返回一个 IOperationResult,您可以像在示例中使用“get”变量一样使用每个键。

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        在桶上创建主索引;

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

        *从桶中选择*;

        在内部,查询引擎将使用视图/主索引来获取服务器的键列表(完整存储桶扫描),然后使用该列表来检索值。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2017-07-03
            • 2014-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-20
            • 1970-01-01
            • 2011-10-20
            相关资源
            最近更新 更多