如何在C#中检索couchbase数据库中的键/文档列表

时间:2015-01-05 16:59:29

标签: 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();
}

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

5 个答案:

答案 0 :(得分:15)

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

<强>视图

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

下图显示了结构视图:

View Structure

例如,假设您有一个名为 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的下一代查询语言。 N1QL旨在满足分布式面向文档的数据库的查询需求.N1QL中的简单查询有三个部分:

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

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

正如我之前所说,N1QL处于开发者预览状态,因此尚未与Couchbase集成。要使用它,您需要下载它并将其与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
                        );
                }
            }
        }

此外,还有其他变种:

希望这有帮助,

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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

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

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

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

答案 3 :(得分:0)

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

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

  

在存储桶上创建主索引;

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

  

*从桶中选择*;

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

答案 4 :(得分:0)

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

这里可以阅读更多关于多维缩放的内容:

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