0

我正在研究一个 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 值,它当前为空。是否可以选择从 items db 中的 itemId 获取 itemPrice?

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

希望有人可以提供帮助,如果这是一个简单的问题,我很抱歉,但我还是 CouchDB 和 NoSQL 的新手。

4

2 回答 2

0

至于您的问题,您不能真正使用 reduce 函数来获取总价格(就像您将在 SQL 中使用连接一样)。

我建议您执行以下操作:

  1. 构建一个像这样发出复杂键的视图[invoiceId,{_id:itemId}]
  2. 您刚刚构建的视图还将发出以下键的实际发票[invoiceId, null]:这样,您可以在一个查询中获取所有信息。
  3. 您使用您的 invoiceId 查询您的 with 并在本地计算总价。这样,如果您更新单个项目的价格,总价格将被更新。

完整示例:

发票模板:

{
  "_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. 计算总价

此外,您可以这样做:

创建发票时,您可以链接项目 ID 并在创建文档时计算项目的总价。因为它是一张发票,我们不在乎价格是否会在未来更新,因为它是一张发票(如果我错了,请纠正我)。

于 2017-08-10T15:05:57.513 回答
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 和沙发都很陌生。感谢您的帮助。

于 2017-08-11T11:37:04.713 回答