可能な重複動作しないオブジェクト:
Why can’t you modify the data returned by a Mongoose Query (ex: findById)変更マングースは、リテラル結果が
まず私はMongoDBのにクエリを作っていますが、すべて正しい結果を得るが、オブジェクトへのわずかな修正リテラルは機能しません。私がやっていることは、コメントに新しいフィールドを追加することです。私はDBrefメソッドを使用しようとしましたが、動作しなかったので、今は2つのクエリを作成します。
var query = Rss.findOne({ _id: itemId});
query.exec(function(err, feed) {
if (!err && feed.comments) {
console.log(feed.comments.length);
for (var index in feed.comments) {
var author = feed.comments[index].author;
if (author !== undefined) {
User.findById(author, function(err, user) {
/**Problem is here **/
feed.comments[index].name = 'Some random field';
console.log('Added new field' + util.inspect(feed));
});
}
}
}
});
このレスポンスは、.nameフィールドがありません。
Added new field{ _id: 4f34f343c7b0434217000012,
original_link: 'http://com',
publish_date: Fri, 10 Feb 2012 10:36:00 GMT,
summary: 'some text',
title: 'title exampel',
comments:
[ { body: 'well',
author: 4f30265e6f60dc061d000002,
_id: 4f34f3b6f96c58541700000f,
create_date: Fri, 10 Feb 2012 10:38:46 GMT } ],
create_date: Fri, 10 Feb 2012 10:36:51 GMT }
// EDIT詳しく
は、まあ、私は答えを見つけることができますが、いくつかの方法はconsole.log(feed.comments [インデックス])関数への参照を返します。たぶん、mongoosejsの経験が豊富な人は、この状況で何が回避策になるのか説明できます。
関数を返すことについてはわかりませんが、あなたの 'インデックス'はあなたが望むことをしていません。 'for..in'を使って配列をループしてはいけません。範囲に適切な 'for'ループを使用してください。また、 'findById'は非同期で、インデックスをキャプチャすることは決して新しいスコープではありませんので、名前を設定するときには常に最後のインデックスを使用します。 – loganfsmyth
はい、これは本当ですか、最後の問題を解決するにはどうすればよいでしょうか? –
新しいスコープで配列インデックスを取得する必要があります。通常は 'for(function(index){...})(index); 'でforの内容をラップします。これは新しい関数を作成して直ちに実行するので、関数内のindexの値はfindOneコールバックを使ってクロージャ内に取り込まれます。 – loganfsmyth