フィーダークエリとしても、集約フレームワークがここで使用するのに適切な操作であるとは本当に思いません。実行しているのは、配列を個々のドキュメントとして「非正規化」することだけです。本当に必要はないはずです。代わりにドキュメントを取得してください:
var query = {}; // whatever criteria
Users.find(query,"Invitation",function(err,docs) {
if (err) {
console.log(err);
var results = [];
async.each(docs,function(doc,callback) {
async.each(docs.Invitation,function(invite,callback) {
Users.findOneAndUpdate(
{ "_id": doc._id, "Invitation._id": invite._id },
{ "$set": { "Invitation.$.Accepted": !invite.Accepted } },
function(err,doc) {
results.push( doc );
callback(err);
}
);
},callback);
},function(err) {
if (err)
console.log(err);
console.log(results);
});
});
したがって、実行していることに対する応答でドキュメントのリストを反復処理することに問題はありません。配列メンバーも反復処理する必要があるだけです。キャッチは、あらゆる種類の .update()
を発行する場合です。 知っておく必要があることを知っておく必要があります。そうすれば、非同期呼び出しが完了します。
そのため、async.each
を使用しています。 ただし、おそらくasync.eachLimit
が必要です。 ループを制御します。要素の一致は、 position $
>
クエリ内の一致した配列要素に対応する演算子。
これは単なるJavaScriptコードなので、値を!invite.accepted
で「切り替える」だけです。 これは逆になります。さらに楽しくするには、変更したドキュメントを からプッシュして、「results」配列を返します。 .findOneAndUpdate()
。