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

我有横切和购买集合,这是横断面和购买细节,现在我想将其转换为单个集合。 基于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", } 

我的期望结果:这是订单collecion应该如何存储{

  "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", } ] } 

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

在你的结构中, transectionidStringtypes的,你不可以在你的模式中使用ref 。 所以填充transectionid你应该使用$lookup因为我们可以定义, localFieldforeignField 。 因为你不需要在你的模式中使用ref

你应该在你的Transaction模式中添加items: [] ,因为如果你没有添加,你可能不会在你的结果中获得items

transaction控制器中可以添加这个函数来获取所有与purchase数据的交易作为项目。

对于from $lookup字段你应该使用小写和复数forms的集合名称,因为当mongoose创build集合使其复数。 像导出的模式名称PurchasesData那么它将创build类似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); } }); }; 

以及使用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]); } } } } 

这里是一个工作小提琴(请注意,有些名称是不一样的,例如input'transections) https://jsfiddle.net/yph9yc86/1/1/

如果您使用的是本地mongo驱动程序,则需要自行实施。

如果你正在使用mongoose,那么就看看人群 ,甚至跨越数据库人群 ,因为他们已经完成了所有的工作。

例如,根据你的模式:

 var mongoose = require('mongoose') , Schema = mongoose.Schema var transactionSchema = Schema({ transectiondate: Date, transectionid : Number, transectionamount: Number, items: [{ type: Number, ref: 'Item' }] }); var itemSchema = Schema({ transectionid: Number, purchaseid : Number, itemprice: Number, itemcode: String, itemquantity: Number, }); var Transaction = mongoose.model('Transaction', transactionSchema); var Item = mongoose.model('Item', itemSchema); Transaction .find({}) .populate('items') .exec(function (err, transactinos) { console.log(transactinos); });