Получить значение из базы данных в другую базу данных
Я работаю над сценарием использования 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).
Я предлагаю вам следующее:
- Создайте представление, которое выдает сложный ключ, как это
[invoiceId,{_id:itemId}]
- Представление, которое вы только что создали, также будет генерировать фактический счет для следующего ключа:
[invoiceId, null]
, Таким образом, вы получите всю свою информацию в одном запросе. - Вы запрашиваете с помощью 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});
}
}
}
}
Теперь, что вы должны сделать?
- Запросить представление с этими параметрами? Key=invoiceId&include_docs=true&group_level=1
- Перебирайте ваши данные и создавайте карту из элементов и присваивайте свой счет переменной.
- Теперь в вашем счете, для каждого товара, установите общую цену, умножив количество на цену товара.
Другое решение
Другой способ сделать это (проще, но в два запроса) 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 и на диване. Спасибо за помощь.