0

find を使用して一連のドキュメントについて MongoDB にクエリを実行し、それらの結果を JSON に出力できる node.js モジュールを作成しました。私の質問は、node.js が非同期であることを知っているので、このクエリ (アイテム) の結果を使用して、MongoDB に戻って別のドキュメント セットを見つけるクエリを作成するにはどうすればよいかということです。このクエリは基本的に、従業員に関する情報 (firstName、lastName など) を含むドキュメントのクエリに使用できる従業員 ID のリストを返します。次に、それらの結果を代わりに JSON として出力します。最初のクエリは基本的に、特定のユーザーが表示できるすべての従業員を教えてくださいというものです。次に、以下に示すように、従業員 ID を取得し、これらの個人情報を含む別の一連のドキュメントに対してクエリを実行する必要があります。

2 つのドキュメント スキーマを次に示します。

従業員

{
"_id" : ObjectId("5208db78ecc00915e0900699"),
"clientId" : 1,
"employeeId" : "12345",
"lastName" : "DOE",
"firstName" : "JOHN",
"middleName" : "A",
"badge" : "8675309",
"birthDate" : "10/12/1978"
}

従業員がアクセスできるユーザー (ユーザー キャッシュ)

{
"_id" : ObjectId("520920a99bc417b7c5e36abf"),
"clientSystem" : "SystemX",
"customerNumber" : "1",
"clientUserId" : "jdoe3",
"securityCode" : "authorize",
"employeeId" : "12345",
"creationDate" : "2013-Aug-12 13:51:37"
}

これが私のコードです:

exports.employeeList = function(req, res) {
    console.log(req.params);
    var clientSystem = req.query["clientSystem"];
    var clientUserId = req.query["clientUserId"];
    var customerNumber = req.query["customerNumber"];
    var securityCode = req.query["securityCode"];

 if (clientSystem != null && clientUserId != null && customerNumber != null && securityCode != null){
    db.collection('ExtEmployeeList', function(err, collection){
        collection.find({'clientSystem': clientSystem, 'clientUserId':clientUserId, 'customerNumber':customerNumber, 'securityCode': securityCode}).toArray(function (err, items){
             console.log(items);
             res.jsonp(items);
        });//close find
     });//close collection
}//close if
else {
   res.send(400);
}//close else
};//close function
4

1 に答える 1

2

あなたがやりたいことは可能ですが、おそらくMongoの最も効果的な使用法ではありません. 私は、データが実際にどのように使用されるかを中心に Mongo ドキュメントを設計する傾向があります。したがって、表示できるユーザーのリストにユーザーの名前を表示する必要がある場合は、そのデータを埋め込むことで、必要なすべての情報を取得するために mongo に何度も往復する必要がなくなります。私は次のようなことをします:

{
  "_id" : ObjectId("520920a99bc417b7c5e36abf"),
  "clientSystem" : "SystemX",
  "customerNumber" : "1",
  "clientUserId" : "jdoe3",
  "securityCode" : "authorize",
  "employeeId" : "12345",
  "creationDate" : "2013-Aug-12 13:51:37"
  "employee": {
    "_id" : ObjectId("5208db78ecc00915e0900699"),
    "clientId" : 1,
    "employeeId" : "12345",
    "lastName" : "DOE",
    "firstName" : "JOHN",
    "middleName" : "A",
    "badge" : "8675309",
    "birthDate" : "10/12/1978"
  }
}

はい、データを複製していますが、データベースへの往復回数を劇的に減らしています。これは通常、テーブルを結合できないため、ドキュメント ベースのデータベースを使用する場合のトレードオフです。

于 2013-08-12T21:43:27.187 に答える