我正在开发一个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
}
] } }
然后我想从我的项目db中取出价格并输入totalPrice值,它当前为null。是否可以选择从项目db中的itemId获取itemPrice?
{
"_id": "someID",
"_rev": "someRev",
"itemId": 1,
"itemName": "gravida",
"itemPrice": "$39.05"
}
希望有人可以提供帮助,如果这是一个简单的问题,我很抱歉,但我仍然是CouchDB和NoSQL的新手。
答案 0 :(得分:0)
至于你的问题,你不能真正使用reduce函数来获得总价(就像你在SQL中使用连接一样)。
我建议你做的是:
[invoiceId,{_id:itemId}]
[invoiceId, null]
。这样,您就可以在一个查询中获得所有信息。{
"_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.索取发票文件 2.从发票文档中请求带有ID的项目。 3.计算总价
另外,你可以这样做:
创建发票时,您可以在创建文档时链接商品ID并计算商品的总价。因为它是发票,我们不在乎将来价格是否更新,因为它是发票(如果我错了,请纠正我)。
答案 1 :(得分:0)
好吧。您的发票模板已
"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属性更改为项目?对不起,如果这让你头疼,但我对javascript和沙发都很新。谢谢你的帮助。