MongoDBでは、$pullAll
を使用できます 指定した値のすべてのインスタンスを既存の配列から削除する演算子。
$pullAll
を使用します update()
などのメソッドと組み合わせて 、updateOne()
、またはupdateMany()
指定したドキュメントを変更で更新します。
例
次のドキュメントを含むコレクションがあるとします。
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
そして、7
のすべての値を削除したいとします。 ドキュメント1の配列から。
これを行うことができます:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このメッセージは、1つのドキュメントが一致し、1つ(つまり同じドキュメント)が変更されたことを示しています。
今すぐコレクションを見てみましょう:
db.foo.find()
結果:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
ドキュメント1の配列にはすべての7
が含まれていることがわかります。 指定どおりに値が削除されました。
複数の値を削除する
$pullAll
に提供した引数 は配列であるため、複数の値をカンマで区切ることで削除できます。
例:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
それでは、コレクションをもう一度確認しましょう:
db.foo.find()
結果:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
値が17
であることがわかります および18
ドキュメント2のアレイから削除されました。
すべてのドキュメントを更新
multi: true
を追加できます または、updateMany()
を使用します 基準に一致するすべてのドキュメントを更新する方法。
これを行うときは、最初のクエリドキュメントから選択基準を削除します(更新するドキュメントを指定します)。つまり、update()
の最初の引数として空のドキュメントを使用します (またはupdateMany()
)メソッド。
例:
db.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
出力:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
この場合、3つのドキュメントが一致し(コレクションに3つのドキュメントがあるため)、3つすべてが変更された(すべて指定された値が含まれているため)ことがわかります。
コレクションをもう一度確認しましょう:
db.foo.find()
結果:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
すべてのインスタンスが指定どおりに更新されていることがわかります。