从数据库中获取值到不同的数据库
Get value from database into different database
我正在处理一个 CouchDB 用例,我有 3 个数据库,其中有客户、发票(包括发票行数组)和项目。在 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 值中。是否可以选择从项目数据库中的 itemId 获取 itemPrice?
{
"_id": "someID",
"_rev": "someRev",
"itemId": 1,
"itemName": "gravida",
"itemPrice": ".05"
}
希望有人能提供帮助,如果这是一个简单的问题,我很抱歉,但我对 CouchDB 和 NoSQL 还是个新手。
至于你的问题,你不能真正使用 reduce 函数来获取总价(正如你将在 SQL 中使用 joins 所做的那样)。
我建议您执行以下操作:
- 构建一个像这样发出复杂键的视图
[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. 从发票文档中请求带有 id 的项目。
3.计算总价
此外,您可以这样做:
创建发票时,您可以 link 项目 ID 并在创建文档时计算项目的总价。由于是发票,所以我们不关心以后价格是否更新,因为它是发票(如果我错了请指正)。
好吧好吧。您的发票模板有
"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": ".65"
所以你的解决方案很好,但是我必须将我的 ItemId 属性 更改为项目,如果我理解正确的话?抱歉,如果这让您感到头疼,但我对 javascript 和沙发都很陌生。感谢您的帮助。
我正在处理一个 CouchDB 用例,我有 3 个数据库,其中有客户、发票(包括发票行数组)和项目。在 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 值中。是否可以选择从项目数据库中的 itemId 获取 itemPrice?
{
"_id": "someID",
"_rev": "someRev",
"itemId": 1,
"itemName": "gravida",
"itemPrice": ".05"
}
希望有人能提供帮助,如果这是一个简单的问题,我很抱歉,但我对 CouchDB 和 NoSQL 还是个新手。
至于你的问题,你不能真正使用 reduce 函数来获取总价(正如你将在 SQL 中使用 joins 所做的那样)。
我建议您执行以下操作:
- 构建一个像这样发出复杂键的视图
[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. 从发票文档中请求带有 id 的项目。 3.计算总价
此外,您可以这样做:
创建发票时,您可以 link 项目 ID 并在创建文档时计算项目的总价。由于是发票,所以我们不关心以后价格是否更新,因为它是发票(如果我错了请指正)。
好吧好吧。您的发票模板有
"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": ".65"
所以你的解决方案很好,但是我必须将我的 ItemId 属性 更改为项目,如果我理解正确的话?抱歉,如果这让您感到头疼,但我对 javascript 和沙发都很陌生。感谢您的帮助。