2013-03-12 4 views
0

Я делаю приложение, которое клиенты могли отправлять пользовательские данные, и эти пользовательские данные должны быть «запросами», я имею в виду, что клиент мог искать эти поля.Каков наилучший подход для запроса пользовательских данных. MongoDB/ElasticSearch

Данные, передаваемые для пользователя ниже:

data = { 
    name: "Thiago", 
    id: 2093 
    country: "Portugal", 
    custom_data: { 
    company: "foo", 
    plan: "pro", 
    department: "it", 
    sessions: 203 
    } 
} 

В связи с требованием применения схемы менее, мы используем MongoDB для сохранения данных.

Но, мне интересно, как запрашивать эти пользовательские данные? У нас нет индекса для этих полей, и есть много документов ~ 1.3M.

Я думаю, что, используя elasticsearch, мы можем справиться с этим требованием, но есть ли хороший подход, не используя его? только используя mongodb?

Один пример запроса может быть:

Найти все из Португалии и имеют более чем 100 логинов.

Заранее спасибо

+0

У вас есть произвольные документы и произвольные запросы? Если это так, тогда запросы будут выполняться как SLOW каждый раз, когда они выполняются, так как каждый документ нужно будет отсканировать. Даже со всем в памяти это не будет быстрым или эффективным, к сожалению, без индекса. – WiredPrairie

+0

@WiredPrairie право. Я использую elasticsearch для индексации моих документов. У каждого арендатора будет свой собственный индекс внутри ES. Интересно, правильно ли этот подход, что вы думаете? elasticsearch хороший подход для этого сценария? – CHAPa

+0

Учитывая, что вам нужны типы данных (> 100), и вы не можете создавать индексы для каждой комбинации (так как в коллекции должно быть не более 64 индексов с рекомендацией постоянно оставаться под 16), я не вижу эффективного эффективного/логичным способом моделирования этого в MongoDB. Может быть один, но это не очевидно. – WiredPrairie

ответ

0

Вы можете хранить ваши данные динамически запрашивается в виде массива пар «напечатал» ключ-значение, так как:

query_data: [ 
    { type: "company", value: "foo" }, 
    { type: "plan", value: "pro" }, 
    ... 
    ] 

, а затем индекс .Type и .value

Учитывая ваш пример, это будет выглядеть так:

> db.xx.findOne() 
{ 
    "_id" : ObjectId("515ca2bc57a0887a97cc8d14"), 
    "name" : "Thiago", 
    "id" : 2093, 
    "country" : "Portugal", 
    "custom_data" : [ 
     { 
      "type" : "company", 
      "value" : "foo" 
     }, 
     { 
      "type" : "plan", 
      "value" : "pro" 
     }, 
     { 
      "type" : "department", 
      "value" : "it" 
     }, 
     { 
      "type" : "sessions", 
      "value" : 203 
     } 
    ] 
} 
> db.xx.ensureIndex({country:1,"custom_data.type":1,"custom_data.value":1}) 
> db.xx.find({country:"Portugal","custom_data.type":"sessions","custom_data.value":{$gt:100}}).explain() 
{ 
    "cursor" : "BtreeCursor country_1_custom_data.type_1_custom_data.value_1", 
    "isMultiKey" : true, 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 1, 
    "nscannedAllPlans" : 1, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "country" : [ 
      [ 
       "Portugal", 
       "Portugal" 
      ] 
     ], 
     "custom_data.type" : [ 
      [ 
       "sessions", 
       "sessions" 
      ] 
     ], 
     "custom_data.value" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "Aspire-5750:27017" 
} 
+0

Спасибо @ronasta! На самом деле вам нравится. Решите мою проблему! – CHAPa