Couchbase Lite是否用于查询数据?

时间:2016-04-13 12:48:21

标签: c# couchbase-lite couchbase-view

我们正在考虑为使用Xamarin.IOS构建的iPad应用程序实施Couchbase。这是我们第一次深入了解Couchbase,并希望确保我们的用例是Couchbase可以实现的。

我们的主要用例是能够查询存储在NoSQL数据库中的数据。视图似乎是执行此操作的唯一方法。看起来很奇怪,实际文档不能像MongoDB等其他NoSQL数据库一样直接查询。

假设我们的数据采用以下格式:

{
   "Id":1,
   "FirstName":"John",
   "LastName":"Doe",
   "DepartmentId":1,
   "StatusId":2
}

我们希望按如下方式查询此数据:

  1. DepartmentId = 1
  2. 的所有记录
  3. StatusId = 2
  4. 的所有记录
  5. DepartmentId = 1 AND St​​atusId = 2
  6. 的所有记录
  7. 所有记录的DepartmentId = 1或StatusId = 2
  8. 在此演示文稿中,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查询性能的任何基准测试吗?

1 个答案:

答案 0 :(得分:2)

要查询一系列值,您可以使用http://developer.couchbase.com/documentation/mobile/1.2/develop/references/couchbase-lite/couchbase-lite/query/query/index.html中记录的startKeyendKey。因此,当您拥有基于[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对象网格要快。因此,我担心您必须使用文档大小,结构和查询结果对自己进行基准测试。