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

1つのリクエストで配列オブジェクトの複数のフィールドを更新するにはどうすればよいですか?

    $ set> 位置$ オペレーター 一致した両方のキーを更新します。

    私はオブジェクトマニピュレーションの最新のES6方法を好みます:

    let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };
    
    let update = [
      { 'store.products._id': params._id },
      { "$set": Object.keys(params).filter(k => k != '_id')
        .reduce((acc,curr) =>
          Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
        { })
      }
    ];
    
    User.update(...update,callback);
    

    これにより、MongoDBへの呼び出しが( mongoose.set('debug'、true)として生成されます。 )オンになっているため、リクエストが表示されます:

    基本的に入力を受け取る場所params _idを指定します 「クエリ」の最初の引数として:

      { 'store.products._id': params._id },
    

    残りは、を介して、オブジェクトから「キー」を取得します。 Object.keys これにより、 Array.filter() 次に、Arrayに渡します。減らす これらのキーをObjectに変換します 。

    .reduce()内 Object.assign()<と呼びます。 / code> これは、次の形式で生成された、指定されたキーでオブジェクトを「マージ」します:

      Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
    

    テンプレート構文を使用して「現在の」(curr)「キー」を新しいキー名に割り当てます。ここでもES6キー割り当て構文[]: これにより、オブジェクトリテラルで変数名を使用できます。

    結果の「マージされた」オブジェクトは、 $ setである「root」オブジェクトに割り当てられるように戻されます。 は更新のキーに使用されるため、「生成された」キーはその子になります。

    純粋にデバッグ目的で引数に配列を使用しますが、実際の .update()でよりクリーンな構文を使用することもできます。 「スプレッド」...を使用する 引数を割り当てる演算子:

    User.update(...update,callback);
    

    クリーンでシンプル、そしてオブジェクトと配列の操作のために学ぶべきいくつかのJavaScriptテクニック。ほとんどの場合、MongoDBクエリDSLは基本的に「オブジェクト」と「配列」です。だからそれらを操作することを学ぶ。



    1. マングース:ObjectIdsでaddToSetを使用すると、孤立したIDになります

    2. スキーマなしのマングース読み取り専用

    3. XMLデータをmongodbコレクションに保存する

    4. 正規表現で変数を使用して、mongodb(Meteorアプリ)のデータを検索します