2016-04-04 5 views
0

Так что у меня критерии, выглядит следующим образом:Cloudant запросов нескольких баз данных

{ 
    _id: '1234', 
    name: 'Weight', 
    states: [{ 
     _id: '5678', 
     name: 'Heavy', 
     filters: [{ 
      type: 'field', 
      operator: '>', 
      field: 'weightWithBattery', 
      expression: '100' 
     }] 
    }, { 
     _id: '91011', 
     name: 'Light', 
     filters: [{ 
      type: 'field', 
      operator: '<', 
      field: 'weightWithBattery', 
      expression: '101' 
     }] 
    }] 
} 

Это только один пример, у меня есть довольно много. База данных, которая содержит эти документы, точно названа критериев.

Теперь я хочу, чтобы создать новую базу данных под названием персон, которая будет иметь документы, которые выглядят примерно так:

{ 
    name: 'Weekender', 
    states: [91011] 
} 

Таким образом, в этом случае Weekender требуют света пунктов. Состояния ссылаются на состояние в пределах критериев . Проблема в том, что я действительно новичок в облачной среде, поэтому я понятия не имею, как установить это (даже если я должен использовать отдельную базу данных), и я понятия не имею, как построить запрос, чтобы, если я получить persona Я хочу, чтобы он тянул все заявляет (как и я предполагаю).

Может кто-нибудь помочь мне?

ответ

0

Я думаю, у вас есть пара вариантов здесь. Прежде всего, представление не может объединять данные в разных базах данных. Таким образом, один из вариантов, который будет NOT Работа имеет единый вид с двумя базами данных.

Я думаю, что наиболее прямой способ сделать это - использовать две базы данных и сделать два вызова. Первый вызов получит persona. Второй вызов будет использовать массив states на объекте persona для извлечения состояний из базы данных criteria. Второй вызов будет выглядеть примерно так:

{ 
    "selector": { 
    "_id": { "$gt": null }, 
    "states": { 
     "$elemMatch" : { 
     "_id": {"$in": ["91011","xyz"] } 
     } 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev", 
    "states" 
    ] 
} 

Примечание: это вернет _id в criteria и всех состояний критерия вводится, например, так:

{ 
    "_id": "1234", 
    "_rev": "2-c61f92414e9f016e9fae97a9c1214dc5", 
    "states": [ 
    { 
     "_id": "5678", 
     "name": "Heavy", 
     "filters": [{ 
     "type": "field", 
     "operator": ">", 
     "field": "weightWithBattery", 
     "expression": "100" 
     }] 
    }, 
    { 
     "_id": "91011", 
     "name": "Light", 
     "filters": [{ 
     "type": "field", 
     "operator": "<", 
     "field": "weightWithBattery", 
     "expression": "101" 
     }] 
    } 
    ] 
} 

Так, в коде, вы должны были бы отфильтровать те состояния, которые соответствуют. Один из способов - хранить ваши штаты как отдельные документы в своей собственной базе данных. Тогда ваш второй запрос будет на базе states и выглядеть примерно так:

{ 
    "selector": { 
    "_id": { 
     "$gt": null, 
     "$in": ["91011","xyz"] 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ] 
} 

Я склоняюсь к этой реализации, если нет какого-то другого требования для сохранения состояния внутри критериев документов.

Наконец, есть способ вернуть criteria и persona в одном запросе - похож на JOIN в SQL. Это включало бы добавление поля type в каждый документ, создание представления и запрос этого вида со специальными фильтрами. Если вы заинтересованы, вы можете узнать больше здесь:

https://cloudant.com/blog/sql-joins/

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