从数据库中获取值到不同的数据库

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 所做的那样)。

我建议您执行以下操作:

  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. 从发票文档中请求带有 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 和沙发都很陌生。感谢您的帮助。