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

时间:2017-08-10 13:26:05

标签: javascript couchdb couchdb-2.0 fauxton nosql

我正在开发一个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的新手。

2 个答案:

答案 0 :(得分:0)

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

我建议你做的是:

  1. 构建一个发出类似此[invoiceId,{_id:itemId}]
  2. 的复杂密钥的视图
  3. 您刚构建的视图还会为以下密钥发出实际发票:[invoiceId, null]。这样,您就可以在一个查询中获得所有信息。
  4. 您使用invoiceId查询并在本地计算总价。这样,如果您更新单个商品的价格,则会更新总价。
  5. 完整示例:

    发票模板:

    {
      "_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. 现在在发票中,对于每件商品,请通过将数量乘以商品价格来设置总价格。
    4. 其他解决方案

      另一种方法(简单但有两个请求)  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和沙发都很新。谢谢你的帮助。