2016-12-02 59 views
7

我有橫切和購買集合,這是橫斷面和購買細節現在我想將其轉換爲單一集合。 基於transectionid我們需要的文件如何使用node.js結合基於id(transectionid)的兩個集合?

下面是我的橫斷收集數據的

{ 

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

}, 
{ 

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

} 
下面

是我購買收藏DATAS

{ 

    "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

採取$ addToSet一看一次。這可能適合你。 –

+0

你想在一個集合中遷移,或者只是按照預期的結果返回到客戶端? –

+0

我想寫在控制器或架構不在客戶端 –

回答

1

根據您預期的結果可能要與人口的購買數據項獲得所有交易。

在您的結構中transectionidString類型,您可能不會在模式中使用ref。所以填充transectionid你應該使用$lookup因爲我們可以定義fromlocalFieldforeignField。因爲你不需要在模式中使用ref

並且您應該在Transaction模式中添加items: [],因爲如果您未添加該數據,您的結果中可能不會得到items

transaction控制器

可以添加此功能與purchase數據項獲得所有交易。

from字段在$lookup您應該使用小寫字母和複數形式的集合名稱,因爲當貓鼬創建集合使其成爲複數時。喜歡你的出口模式名稱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); 
    } 
    }); 
}; 
+0

我在mongodb中出現錯誤。請你幫忙我出了@ Shaishab Roy –

+0

http://stackoverflow.com/questions/43542270/how-can-i-combine-multiple-collection-into-one-collection-using-with-lookup-mon –

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]); 
      } 
     } 
    } 
} 

這裏是工作提琴(注意,有些名稱不相同,您input'transections'爲例)https://jsfiddle.net/yph9yc86/1/

+0

http://stackoverflow.com/questions/43542270/how-can-i-combine-multiple-collection-into-one-collection-using-with-lookup-mon –

2

如果您正在使用本地蒙戈驅動程序,你需要實現它自己。

如果你正在使用貓鼬,看看population,甚至cross DB population,因爲他們已經做了所有的工作。

例如,根據您的架構:

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); 
}); 
+0

我有兩個不同的收藏不是這樣的 –

+0

這是2個系列。每個模式都是一個集合。就像我寫的,即使它們是兩個集合,其中每個集合都位於不同的數據庫上,貓鼬也可以做同樣的事情。 –

+0

http://stackoverflow.com/questions/43542270/how-can-i-combine-multiple-collection-into-one-collection-using-with-lookup-mon –