2017-03-28 10 views
2

ノード/モンゴーにまだNooBがあり、これに固執しています。nodejs/Mongo - 複数が動作しないことを発見しました

私は2つのモンゴーコレクション、テナントと賃貸料を持っています。賃料集計にはスキーマにテナント_idがあります。次の機能は、すべてのアクティブなテナントを検索し、最新のレンタル文書の属性を引き出すものです。 関数の最初の部分は、テナントオブジェクトに結果を設定します。すべての作業良い。 2番目のテナントオブジェクトは、Rentクエリで使用する_idを引き出します。 (参加する)。 問題はforループが繰り返し処理して_idを正しく表示しているように見えますが、2番目の検索クエリはオブジェクト内の最後の文書のみを出力するようです。これは、事前に

おかげで起こっているなぜ私はただわからない

app.get('/chargerenttest/:date', (req,res) => { 

//check date is valid 
var rentChargeDate = new Date(req.params.date); 
var tenant = ""; 
//for each active tenant 



Tenant .find({ 
      activeTenant : true 
      }) 
     .then ((tenant) => {   
      if (!tenant) { 
      return res.status(404).send(); 
      } 
      console.log("found tenents") 
      return tenant 
      }) 

      .then ((tenant) => { 
      for (var i in tenant) { 
       console.log(i) 
       console.log(tenant[i]._id) 

       Rent 
       .find({ 
        "paymentType" :"Rent", 
        "tenantID" : tenant[i]._id, 
        "activeEntry": true}) 
       .limit(1) 
       .sort({datePaid: -1}) 
        // sort in decending date (latested on top) 
       .then ((rent) => { 
         lastPayment = rent[0].datePaid; 
         lastAmountPaid = rent[0].amountPaid; 

         console.log("--------",i) 

         console.log("tenant",tenant[i]._id) 
         console.log("rentamount",tenant[i].rentAmount) 
         console.log("lastpayment", lastPayment)   
        });   
      } 

      }) 

})

+0

こちらをご確認ください:https://github.com/Automattic/mongoose レコードを取得するソースコードは(の真ん中にあってもよいのホームページにありますページ) –

答えて

1

あなたのクエリが$lookupとのパイプラインを使用する集約演算を実行することによって単純化することができます演算子を使用すると、同じデータベース内の別のコレクションへの左外部結合を実行して、処理のために「結合」されたコレクションの文書をフィルタリングできます。このモジュールは、多くの単純な複数のコレクションに参加作ることができる@coolgk/mongo

Rent.aggregate([ 
    { 
     "$match": { 
      "paymentType": "Rent", 
      "activeEntry": true 
     } 
    }, 
    { 
     "$lookup": { 
      "from": "tenants", 
      "localField": "tenantID", 
      "foreignField": "_id", 
      "as": "tenants" 
     } 
    }, 
    { "$match": { "tenants": { "$ne": [] }, "tenants.activeTenant": true } }, 
    //{ "$unwind": "$tenants" }, 
    { "$sort": { "datePaid": -1 } }, 
    { "$limit": 1 }  
]).exec((err, rent) => { 
    if (err) throw err; 

    lastPayment = rent[0].datePaid; 
    lastAmountPaid = rent[0].amountPaid; 
    tenant = rent[0].tenants[0]; 

    console.log("tenant",tenant._id) 
    console.log("rentamount",tenant.rentAmount) 
    console.log("lastpayment", lastPayment) 
}); 
0

は、次のパイプラインを実行することを検討してください。モンゴへ

SQL

SELECT * FROM a LEFT JOIN b ON a.b_id = b.id

model.find({}, { 
    join: [ { on: 'b_id' } ] 
}) 

結果になりましょう

左への参加:

[{ 
    _id: '5a8bde4ae2ead929f89f3c42', 
    a_name: 'aname1', 
    b_id: { 
     _id: '5a8bde4ae2ead929f89f3c41', 
     b_name: 'bname1' 
    } 
}, { ... }, ... ] 

SELECT * FROM a, b WHERE a.b_id = b.id AND b.b_name = 'bname1'

になる制約で インナー参加

model.find({}, { 
    join: [ { on: 'b_id', filters: { b_name: 'bname1' } } ] 
}) 

結果:Mulitpleコレクションに参加

[{ 
    _id: '5a8bdfb05d44ea2a08fa8a4c', 
    a_name: 'aname2', 
    b_id: { 
     _id: '5a8bdfb05d44ea2a08fa8a4b', 
     b_name: 'bname2' 
    } 
}] 
インナー

SELECT * FROM a, b, c WHERE a.b_id = b.id AND b.c_id = c.id AND c.c_name = 'cname3'

modela.find({}, { 
    join: [{ 
     on: 'b_id', 
     join: [{ 
      on: 'c_id', 
      filters: { c_name: 'cname3' } 
     }] 
    }] 
}) 

結果次のようになります。

[{ 
    _id: '5a8bdfc1b07af22a12cb1f0b', 
    a_name: 'aname3', 
    b_id: { 
     _id: '5a8bdfc1b07af22a12cb1f0a', 
     b_name: 'bname3', 
     c_id: { 
      _id: '5a8bdfc1b07af22a12cb1f09', 
      c_name: 'cname3' 
     } 
    } 
}] 
関連する問題