2016-06-24 23 views
1

mongoose照会からの2つの結果オブジェクトを1つのオブジェクトに結合しようとしています。 これはなぜ機能しないのですか?どのようにこの作品を作るためのアイデア?照会された別のオブジェクトを別の照会オブジェクトで照会

exports.get = function(req, res, err) { 
    Project.findOne({ 
     _id: req.params.id 
    }, function(err, project) { 
     Client.findOne({ 
      _id: project.clientId 
     }, function(err, client) { 
      project.foo = "bar" // works 
      project.client = client; // why is this not working? 
      res.send(project); // object has property "foo" but no property "client" 
     }) 
    }) 
} 

答えて

0

Mongoose documentsプロパティを追加することはできません。 lean()メソッドをexec()の前に呼び出す必要があります。これは、リーンオプションを有効にしたクエリから返されたドキュメントがプレーンなjavascriptオブジェクトだからです。ドキュメントから

Project.find().lean().exec(function (err, project) { 
    project[0] instanceof mongoose.Document // false 
}); 

だからあなたのコードは次のようになります。

exports.get = function(req, res, err) { 
    Project.findOne({ '_id': req.params.id }) 
      .lean() 
      .exec(function(err, project) { 
       Client.findOne({ '_id': project.clientId }) 
        .lean() 
        .exec(function(err, client) { 
         project.foo = "bar" // works 
         project.client = client; // works 
         res.send(project); // object has both properties 
        }); 
      }); 
} 

またはプレーンJSオブジェクトに戻されたドキュメントキャスト:純粋な美しさ厥

exports.get = function(req, res, err) { 
    Project.findOne({ 
     _id: req.params.id 
    }, function(err, project) { 
     Client.findOne({ 
      _id: project.clientId 
     }, function(err, client) { 
      var obj = project.toObject(); 
      obj.foo = "bar" // works 
      obj.client = client; // works 
      res.send(obj); // object has both properties 
     }) 
    }) 
} 
+1

を、ありがとうございました! – Seltsam

+0

プロジェクトモデルで定義されたバーチャルがもうこのようには機能していないことが分かりました。ある人は返されたオブジェクトに「実装されている」と期待していますが、そうではありません。そのための回避策はありますか? – Seltsam

+0

mongooseドキュメントで説明されているように、リーンオプションtrueのクエリから返されたドキュメントは、Mongooseドキュメントではなくプレーンなjavascriptオブジェクトなので、回避策があるかどうかはわかりません。セーブメソッド、ゲッター/セッター、または他のモンゴース魔法がバーチャルのように適用されていないので、あなたは謎に遭っているかもしれません。 Mongooseドキュメントを保持する2つのキーを持つラッピングオブジェクトを作成してクライアントに送信することもできます。 'res.send({" project ":project、" client ":client})' – chridam

関連する問題