$ 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は基本的に「オブジェクト」と「配列」です。だからそれらを操作することを学ぶ。