2017-08-19 8 views
0

私はMongoDBデータベースに2つのコレクション、CustomerとOrderを持っています。 Loopbackにおけるこれらのモデルの関係は、顧客-hasMany-> Order & Order -belongsTo-> Customer(注文にはforeignKey customerIdがあるため)です。 たとえば、20歳のすべての顧客の注文を照会する必要がありました。しかし、私はループバックがこの種のクエリをサポートしていないことに気づいたことに驚きました。私は多くを検索し、 "include"オプションでさえ、最終結果として取得したいフォーマットをサポートせず、年齢機能(Loopback-doc-about-it)までフィルタに結合できません。次に、私は2つのクエリを作成するリモートメソッドを書いた:最初のものは、特定の年齢を持つすべての顧客を見つけ出す(基本はフィルタ)、もう1つはリスト内のすべての顧客を繰り返して注文を見つける(基本的に各インデックスについて、インデックスの顧客のIDと同じ得意先コードしているものの受注コレクション)にループバック:非同期ではない複数のコレクションの照会

はここcustomer.jsファイルです:

'use strict'; 
 

 
module.exports = function(Customer) { 
 
    var app = require('../../server/server'); 
 

 
/** 
 
* 
 
* @param {number} age 
 
* @param {Function(Error, array)} callback 
 
*/ 
 

 
    
 
    Customer.getOrdersByAge= function(age, callback) { 
 
     var customers; 
 
     
 
     var filter= { where: { 'age': age } }; 
 

 
     var Order=app.models.Order; 
 
     var orders; 
 

 
     var elementary_orders; 
 

 

 
     Customer.find(filter, function(err, items) { 
 
      if (err !==null){ 
 
       console.log("error1"); 
 
       return callback(err); 
 
      } 
 
      console.log("items: "+ items); 
 
      customers=items; 
 

 

 

 
    
 
      for (let i of customers){ 
 
       console.log(i+": "+i.id+" -lenght: "+customers.length); 
 
       var filter_order= { where: { 'customerId': i.id+'' } }; 
 
       
 
       Order.find(filter_order, function(err2, items_orders) { 
 
        if (err2 !==null){ 
 
         console.log(i+": "+"error2"); 
 
         return callback(err2); 
 
        } 
 
        elementary_orders= items_orders; 
 
        orders=elementary_orders; 
 
        console.log("elementary_orders: "+ elementary_orders); 
 
        console.log("orders now: "+ elementary_orders); 
 
       }); 
 
      
 
      } 
 
      console.log("-> orderssss: "+ orders); 
 
      callback(null,orders); 
 
     }); 
 

 

 

 
     } 
 

 
}; 
 

しかし、その後、私は別の問題を発見し、受注は、常に定義されていません。 「検索」クエリは非同期であるため、注文は未定義のままです。だから、私はそれを同期させる方法を探したが(ループバックの精神は常に非同期であるため不可能だった)、npmの流れを制御する方法(async packageしかしeachOfユーティリティを試しても注文は未定義である)

私はこの簡単なクエリを動作させる方法だけでなく、実装が不可能な理由を知りたいと思いますか?ループバックのモデルや何かに関連する概念的なパターンやアーキテクチャのパターンに違反していますか? 、しかし。

ありがとうございました:)

答えて

0

をあなたがモデルにパッチを適用するために、お客様にasync.map使用することができますし、注文がに追加されますそれら。

async.map(customers, function(customer, mapCallback) { 
    Order.find(params, function (orders, error) { 
    if(ordersError) { 
     mapCallback(null, ordersError); 
    } 

    customer.orders = orders; 
    mapCallback(customer); 
    }); 
}, callback); //This callback is the main from the remote method. 
+0

ありがとう、@ Sonicd300。私はコードを変更しましたが、明らかに設定できません( TypeError:getterのみを持つ#のプロパティオーダーを設定できません)、elementary_ordersを使用しても機能しません。 – amiraba

+0

モデルを通過する必要はありませんむしろあなたのペイロードを返す。 – Sonicd300

+0

しかし、そのコードのcustomer.ordersはそれを参照しています – amiraba

関連する問題