Получить значение из базы данных в другую базу данных

Я работаю над сценарием использования CouchDB, где у меня есть 3 базы данных, где у меня есть клиенты, счета-фактуры (включая массив invoiceLines) и товары. В массиве invoiceLines у меня в настоящее время есть это

       "_id": "someId",
      "_rev": "someId",
      "invoiceId": 46,
      "invoiceDate": "11/24/2016",
      "customerId": 85,
      "invoiceLines": [
       {
        "quantity": 10,
        "totalPrice": null,
        "itemId ": 53
       },
       {
        "quantity": 8,
        "totalPrice": null,
        "itemId ": 33
       } 
] } }

Затем я хочу взять цену из моей базы данных и поместить в значение totalPrice, где оно в настоящее время равно нулю. Есть ли возможность взять itemPrice из itemId в базе данных items?

 {
  "_id": "someID",
  "_rev": "someRev",
  "itemId": 1,
  "itemName": "gravida",
  "itemPrice": "$39.05"
  }

Надеюсь, что кто-то может помочь, и я извиняюсь, если это простой вопрос, но я все еще плохо знаком с CouchDB и NoSQL.

2 ответа

Решение

Что касается вашей проблемы, вы не можете использовать функцию Reduce для получения полной цены (как вы будете делать с объединениями в SQL).

Я предлагаю вам следующее:

  1. Создайте представление, которое выдает сложный ключ, как это [invoiceId,{_id:itemId}]
  2. Представление, которое вы только что создали, также будет генерировать фактический счет для следующего ключа: [invoiceId, null], Таким образом, вы получите всю свою информацию в одном запросе.
  3. Вы запрашиваете с помощью invoiceId и локально вычисляете общую цену. Таким образом, если вы обновите цену одного товара, итоговая цена будет обновлена.

Полный пример:

Шаблон счета:

{
  "_id": "306860e48b2f6f668c7f409f33000339",
  "_rev": "3-73197f590a5d18b2ee01ebc423cacbb6",
  "type": "invoice",
  "invoiceDate": "11/24/2016",
  "customerId": "customer_1",
  "invoiceLines": [
    {
      "quantity": 10,
      "item": "item_1"
    },
    {
      "quantity": 8,
      "item": "item_2"
    }
  ]
}

Шаблон элемента

{
  "_id": "item_1",
  "_rev": "2-879798bd718975fe9957a2a699e041d0",
  "type": "item",
  "name": "First item",
  "price": 1
}

Функция просмотра

function(doc){
    if(doc.type == "invoice"){
        emit([doc._id]);
        if(doc.invoiceLines){
            for(var n in doc.invoiceLines){
                var line = doc.invoiceLines[n];
                emit([doc._id,line.item],{_id:line.item});
            }
        }
    }
}

Теперь, что вы должны сделать?

  1. Запросить представление с этими параметрами? Key=invoiceId&include_docs=true&group_level=1
  2. Перебирайте ваши данные и создавайте карту из элементов и присваивайте свой счет переменной.
  3. Теперь в вашем счете, для каждого товара, установите общую цену, умножив количество на цену товара.

Другое решение

Другой способ сделать это (проще, но в два запроса) 1. Запросить документ счета-фактуры 2. Запросить позиции с идентификаторами из документа счета-фактуры. 3. Рассчитать общую стоимость

Также вы можете сделать это:

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

Ну ладно. Ваш шаблон счета имеет

"invoiceLines": [
    {
      "quantity": 10,
      "item": "item_1"
    },
    {
      "quantity": 8,
      "item": "item_2"
    }

Где у меня это:

"invoiceLines": [
   {
    "quantity": 6,
    "totalPrice": null,
    "itemId ": 43
   },
   {
    "quantity": 4,
    "totalPrice": null,
    "itemId ": 58
   },

И вы даете своему _id в элементах еще одно значение? Моя выглядит так

 "_id": "a884e9095e6ce843c16d85a6e1163215",
  "_rev": "2-5ff2a928b68b8d23001b012f0e272626",
  "itemId": 14,
  "type": "items",
  "itemName": "dictum",
  "itemPrice": "$33.65"

Так что с решением у вас все в порядке, но тогда мне придется изменить свойство ItemId на items, если я правильно понимаю? Извините, если это вызывает у вас головную боль, но я действительно новичок в javascript и на диване. Спасибо за помощь.

Другие вопросы по тегам