sql >> データベース >  >> NoSQL >> MongoDB

Mongooseアップサート操作はデフォルトのスキーマ値を更新/更新しますか?

    期待される動作の「証拠」を探している場合は、ソースコード自体を探すだけです。特に 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の「アップサート」アクションの結果として新しいドキュメントが作成されたときに適用されます マップされたフィールド。



    1. MongoDB / Geojson$geointersectsの問題

    2. $unwind空の配列

    3. マングースが埋め込まれている

    4. マングーススキーマのネストされたオブジェクト