我们正在考虑为使用Xamarin.IOS构建的iPad应用程序实施Couchbase。这是我们第一次深入了解Couchbase,并希望确保我们的用例是Couchbase可以实现的。
我们的主要用例是能够查询存储在NoSQL数据库中的数据。视图似乎是执行此操作的唯一方法。看起来很奇怪,实际文档不能像MongoDB等其他NoSQL数据库一样直接查询。
假设我们的数据采用以下格式:
{
"Id":1,
"FirstName":"John",
"LastName":"Doe",
"DepartmentId":1,
"StatusId":2
}
我们希望按如下方式查询此数据:
在此演示文稿中,http://www.slideshare.net/Couchbase/advanced-couchbase-lite我可以看到我们可以使用复合键创建视图。像[DepartmentId,StatusId]
这样的东西但我们无法只使用复合键的一部分进行查询。只有当复合键的两个部分都通过时,Couchbase才会返回结果。 [1,2]这将返回部门1和1的所有记录。状态2。
这可能与Couchbase完全相同吗?或者我们应该考虑其他解决方案?我们不想采用SQL方式,因为我们有非常复杂的JSON对象,并且不想将其转换为表格数据。 NOSQL是前进的方向,但这对我们来说是错误的NOSQL数据库吗?
我们尝试的C#:
// Create the View
var view = db.GetView("all-docs");
view.SetMap((doc, emit) =>
{
var keys = new List<object>();
keys.Add(doc["DepartmentId"].ToString());
keys.Add(doc["StatusId"].ToString());
emit(keys, doc);
}, "1");
// Create Query
var query = view.CreateQuery();
List<Object> searchQuery = new List<Object>();
List<Object> key = new List<Object>();
// Add Query for Keys
key.Add(status);
key.Add(priority);
searchQuery.Add(key);
query.Keys = searchQuery;
// Run Query
var results = await query.RunAsync();
最后,如果我们处理大约1000-5000个对象,有关Couchbase Lite查询性能的任何基准测试吗?
答案 0 :(得分:2)
要查询一系列值,您可以使用http://developer.couchbase.com/documentation/mobile/1.2/develop/references/couchbase-lite/couchbase-lite/query/query/index.html中记录的startKey
和endKey
。因此,当您拥有基于[DeptId, StatusId]
的视图时,您将获得
DeptId
设置为startKey
而[1, 0]
设置为endKey
, [1, maxint]
= 1的所有文档
通过将密钥设置为DeptId
StatusId
= 1和[1, 2]
= 2的所有文档
使用StatusId
作为第一个或唯一组件的其他视图,StatusId
= 2的所有文档。
我不知道直接模拟OR运算符的方法,因此您可能需要单独检索这两个集并以编程方式合并它们。 (这与CB lite有关。在CB服务器上你有更强大的N1QL。)
移动设备的整体性能不仅取决于CB lite本身,还取决于从数据库中检索文档后的处理。当然,从关系数据库获取100个5个属性的记录比从100个复杂的JSON文档构建Java对象网格要快。因此,我担心您必须使用文档大小,结构和查询结果对自己进行基准测试。