如何使用node.js组合基于id(transectionid)的两个集合?

时间:2016-12-02 12:04:48

标签: javascript node.js mongodb

我有横切和购买集合,这是现在我要将横断面和购买细节转换成单个集合。 基于transectionid,我们需要结合文件

以下是我的横断面集合数据

{

    "transectionid": "1",
    "transectionamount": "2000",
    "transectiondate": "2016-07-12 19:22:28",

},
{

    "transectionid": "2",
    "transectionamount": "1000",
    "transectiondate": "2016-07-12 20:17:11",

}

下面是我的购买集合数据

{

    "purchaseid": "1",
    "transectionid": "1",
    "itemprice": "1200",
    "itemcode": "edcvb",
    "itemquantity": "1",


},
{

    "purchaseid": "2",
    "transectionid": "1",
    "itemprice": "800",
    "itemcode": "dfgh",
    "itemquantity": "2",


},
{

    "purchaseid": "3",
    "transectionid": "2",
    "itemprice": "1000",
    "itemcode": "zxcvb",
    "itemquantity": "1",


}

我的期望结果: 这是订单集合应该存储的方式     {

        "transectionid" : "1",
        "transectionamount": "2000",
        "transectiondate": "2016-07-12 19:22:28",
        "items" : [
                {
                    "purchaseid": "1",
                    "itemprice":"1200",
                    "itemcode": "edcvb",
                    "itemquantity": "1",
                },
                {
                    "purchaseid": "2",
                    "itemprice": "800",
                    "itemcode": "dfgh",
                    "itemquantity": "2",
                }
        ]
}
{

        "transectionid" : "2",
        "transectionamount": "1000",
        "transectiondate": "2016-07-12 20:17:11",
        "items" : [
                {
                    "purchaseid": "3",
                    "itemprice":"1000",
                    "itemcode": "zxcvb",
                    "itemquantity": "1",
                }
        ]
}

2 个答案:

答案 0 :(得分:2)

很好地使用javascript和一些循环你可以做到这一点。

var transactionsSize = transactions.length;
var purchasesSize = purchases.length
var finalArray = JSON.parse(JSON.stringify(transactions));

for(var i = 0 ; i < transactionsSize; i++ ) {
    for(var j = 0; j < purchasesSize; j++) {
        if(transactions[i].transactionid == purchases[j].transactionid) {
            if(!finalArray[i].items) {
                finalArray[i].items = [];
                finalArray[i].items.push(purchases[j]);
            } else {
                finalArray[i].items.push(purchases[j]);
            }
         }
     }
}

这是一个工作小提琴(请注意,有些名称与您的输入法不同)https://jsfiddle.net/yph9yc86/1/

答案 1 :(得分:1)

根据您的预期结果,您可能希望将填充的购买数据作为项目进行所有交易。

在您的结构中,transectionidString类型,您可能未在架构中使用ref。所以填充transectionid您应该使用$lookup,因为我们可以定义fromlocalFieldforeignField。为此,您不需要在架构中使用ref

并且您应该在items: []架构中添加Transaction,因为如果您没有添加,则可能无法在结果中获得items

transaction控制器中的

可以添加此函数以将purchase数据作为项目进行所有事务处理。

对于from中的$lookup字段,您应该使用小写和复数形式的集合名称,因为当mongoose创建集合使其复数时。就像导出的模式名称PurchasesData一样,它会像purchasesdatas

一样创建

像:

exports.getTransactions = function(req,res){ 

  Transection.aggregate([ 
    {$lookup:{from:"purchases", localField:"transectionid", foreignField:"transectionid", as:"items"}} 
  ]).exec(function(err, result) { 
    if(err) { 
      console.log('error============', err); 
      return res.status(400).send("error occurred"); 
    }else{ 
      console.log(result); 
      return res.status(200).send(result); 
    } 
  }); 
};