2016-04-13 4 views
2

Мы рассматриваем реализацию Couchbase для iPad-приложения, созданного с помощью Xamarin.IOS. Это первый раз, когда мы копаем в Couchbase и хотим убедиться, что наш прецедент - это то, что можно сделать с Couchbase.Является ли Couchbase Lite предназначенным для запроса данных?

Наш основной случай использования - возможность запросить данные, хранящиеся в базе данных NoSQL. Представления выглядят как единственный способ сделать это. Кажется странным, что фактический документ не может быть запрошен напрямую, как и другие базы данных NoSQL, такие как MongoDB.

Say наши данные в следующем формате:

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

Мы хотели бы запросить эти данные следующим образом:

  1. Все записи с DepartmentID = 1
  2. Все записи с StatusId = 2
  3. Все записи с DepartmentId = 1 И StatusId = 2
  4. Все записи с отчетом mentId = 1 ИЛИ StatusId = 2

Из этой презентации http://www.slideshare.net/Couchbase/advanced-couchbase-lite Я вижу, что мы можем создать представление с помощью составного ключа. Что-то вроде [DepartmentId, StatusId]

Но мы не можем запросить только одну часть составного ключа. Couchbase, кажется, возвращает результаты только в том случае, если переданы обе части составного ключа, например. [1, 2] Это вернет все записи в отдел 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(); 

Наконец, любые тесты на производительность Couchbase Lite запросов, если мы имеем дело с около 1000-5000 объектов?

+0

1000-5000 объектов невероятно мало для любого типа базы данных. – jgauffin

+0

вы можете даже сериализовать 5000 объектов как JSON в плоский файл (по одному объекту в строке) и получить производительность при его запросе. – jgauffin

+0

Объекты довольно сложны и велики, а также можно увеличить их число, поскольку мы увеличиваем сущности, которые хранятся в автономном режиме. Но да, запросы будут в основном на основных объектах, а не на вложенных объектах. Вопрос заключается в том, является ли couchbase правильным nosql db для этих запросов. – Yashvit

ответ

2

Для запроса по целому ряду значений вы можете использовать startKey и endKey, как описано в http://developer.couchbase.com/documentation/mobile/1.2/develop/references/couchbase-lite/couchbase-lite/query/query/index.html. Поэтому, когда у вас есть представление, основанное на [DeptId, StatusId], вы получите

  • все документы с DeptId = 1, установив startKey в [1, 0] и endKey к [1, maxint]

  • все документы с DeptId = 1 и StatusId = 2 установив ключ на [1, 2]

  • все документы с StatusId = 2, используя другой вид, который имеет StatusId as t он первый или только компонент.

  • Я не знаю, как напрямую имитировать оператор OR, поэтому вам может потребоваться извлечь оба набора отдельно и объединить их программно. (Это относится к CB lite. На сервере CB у вас есть N1QL, который является более мощным.)

Общая производительность на мобильном устройстве будет зависеть не только от CB лайт по себе, но и по обработке документов, после того, как они получили извлечена из базы данных. Конечно, получение 100 записей по 5 атрибутов из реляционной БД происходит быстрее, чем создание сетки объектов Java из 100 сложных документов JSON. Поэтому я боюсь, что вам придется сравнивать себя, используя размеры, структуру и результаты вашего документа.

Смежные вопросы