我有横切和购买集合,这是现在我要将横断面和购买细节转换成单个集合。 基于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",
}
]
}
答案 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)
根据您的预期结果,您可能希望将填充的购买数据作为项目进行所有交易。
在您的结构中,transectionid
为String
类型,您可能未在架构中使用ref
。所以填充transectionid
您应该使用$lookup
,因为我们可以定义from
,localField
和foreignField
。为此,您不需要在架构中使用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);
}
});
};