到目前为止,在 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
);
}
}
}
此外,还有其他变体:
希望这会有所帮助。