Couchbase просмотр пользовательского сокращения

я не уверен, подходит ли заголовок вопросов, если вы знаете лучший, дайте мне знать;) Я просто назвал его так, потому что я думаю, смогу ли я решить свою проблему с помощью пользовательской функции сокращения.

У меня есть два типа объектов:

Транспортные средства:

{
  "id": "1G1JC5444R7252367",
  "type": "Vehicle"
}

Пользователи:

{
  "company": "companyname",
  "type": "User",
  "parts": [
    {
      "company": "companyname",
      "id": "1G1JC5444R7252367",
      "active": true
    },
    {
      "company": "companyname",
      "id": "1G1135644R7252367",
      "active": false
    }
  ]
}

Я хочу View, который возвращает мне все автомобили определенной компании. Но компания хранится только в объекте User.

Вот как далеко я продвинулся в mapfunction:

function (doc, meta) {
  if(doc.type == 'User'){
    if(doc.parts){

      Array.prototype.contains = function ( needle ) {
        for (var i in this) {
          if (this[i] == needle) return true;
        }
        return false;
      };

      var ids = new Array(doc.parts.length);

      for(var k in doc.parts){
        if(doc.parts[k].active) {
          if(!vins.contains(doc.parts[k].id)) {
            if (doc.parts[k].company && doc.parts[k].id ) {
              ids.push(doc.parts[k].id);
              emit(doc.parts[k].company, doc.parts[k].id);
            }
          }
        }
      }
    }
  }
}

Но это возвращает мне только компанию в качестве ключа и идентификатор автомобиля в качестве значения. Итак, я получаю документ пользователя. Могу ли я каким-то образом снова просмотреть документы в функции карты и получить все автомобили в соответствии с идентификаторами в моем массиве идентификаторов?

Сохранение компании в самой машине также нежелательно, потому что компания — это не компания самих автомобилей, а компания запчастей.

Спасибо за любую помощь вперед.


person Igle    schedule 29.09.2014    source источник


Ответы (1)


Представление Couchbase может работать только с представленным ему документом. Как вы обнаружили, он может лишь частично делать то, что вы хотите.

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

Фундаментальная концепция баз данных документов заключается в том, что документ должен представлять всю информацию, относящуюся к какому-либо событию. Именно эта концепция позволяет базам данных документов масштабироваться по горизонтали. Вам не следует беспокоиться о дублировании данных. Локальность доступа является ключом к соответствующей модели данных с уменьшением карты.

Я бы переработал вашу модель данных.

person adonoho    schedule 30.09.2014