期待される動作の「証拠」を探している場合は、ソースコード自体を探すだけです。特に schema.js コード> 主な定義
:
updates.$setOnInsert = {};
updates.$setOnInsert[createdAt] = now;
}
return updates;
};
this.methods.initializeTimestamps = function() {
if (createdAt && !this.get(createdAt)) {
this.set(createdAt, new Date());
}
if (updatedAt && !this.get(updatedAt)) {
this.set(updatedAt, new Date());
}
return this;
};
this.pre('findOneAndUpdate', _setTimestampsOnUpdate);
this.pre('update', _setTimestampsOnUpdate);
this.pre('updateOne', _setTimestampsOnUpdate);
this.pre('updateMany', _setTimestampsOnUpdate);
}
function _setTimestampsOnUpdate(next) {
var overwrite = this.options.overwrite;
this.update({}, genUpdates(this.getUpdate(), overwrite), {
overwrite: overwrite
});
applyTimestampsToChildren(this);
next();
}
したがって、すべての'pre'
を見ることができます 「update」メソッドバリアントごとに、同じ機能コードに登録されているミドルウェアハンドラー。これらはすべて、基本的に $ set
を変更します。
updatedAt
を含めるために発行する「更新」の演算子 フィールド、またはスキーマオプションでそのキーにマップした名前。
「upsert」アクションで送信される実際のステートメントは、 $setOnInsert<を使用します。 / code>
createdAt
の場合 フィールドまたはマップされたオプション名(リストの上部を参照)。このアクションはのみ 「アップサート」が実際に発生したときに適用されるため、存在し、「更新」メソッドのいずれかにのみ一致するドキュメントは決してありません。 実際にこの値に触れました。
これらの演算子はMongoDBの動作の一部であり、実際にはmongooseとは関係ありませんが、ここに示すコードは、mongooseがこれらの追加操作を含めるために「更新」アクションを「調整」する方法を示しています。
参考までに、<code> schema.jsのメイン関数全体を参照してください。 現在何を適用するかを決定するのは、行#798<から始まります。 / a> genUpdates()
の場合 ここに示されているリストの下部で呼び出される関数ですが、上部はその関数の最後の数行で、 $ setOnInsert
定義されます。
したがって、要約すると、YESのすべての「更新」アクションは、 updatedAt
が意図的に行われるものです。 マップされたフィールドには現在のDate
があります 割り当てられた値、および「更新」が変更されて $ setOnInsert
のみのアクション createdAt
の「アップサート」アクションの結果として新しいドキュメントが作成されたときに適用されます マップされたフィールド。