MongoDBでは、$pull
を使用できます 配列から値を削除する演算子。
$pull
を使用します update()
などのメソッドと組み合わせて 指定したドキュメントを変更で更新します。
例
products
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
次のように、ドキュメント1の配列から要素を削除できます。
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このメッセージは、1つのドキュメントが一致し、1つ(つまり同じドキュメント)が変更されたことを示しています。
今すぐコレクションを見てみましょう:
db.products.find()
結果:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
ドキュメント1の配列の値がXXL
であることがわかります。 指定どおりに削除されました。
複数の値を削除する
$in
を使用できます 配列から削除する複数の値を指定する演算子。
例:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
それでは、コレクションをもう一度確認しましょう:
db.products.find()
結果:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
ドキュメント3で、指定された2つの要素が配列から削除されていることがわかります。
すべてのドキュメントを更新
multi: true
を追加できます または、updateMany()
を使用します 基準に一致するすべてのドキュメントを更新する方法。
これを行うときは、最初のクエリドキュメントから選択基準を削除します(更新するドキュメントを指定します)。つまり、update()
の最初の引数として空のドキュメントを使用します (またはupdateMany()
)メソッド。
例:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
出力:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
この場合、3つのドキュメントが一致していることがわかります(コレクションに3つのドキュメントがあるため)が、変更されたのは2つだけです(2つだけが値XL
を持っていたため) sizes
で 配列)。
そして、コレクションを再確認します:
db.products.find()
結果:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
XL
のすべてのインスタンスがわかります コレクション内のすべてのドキュメントから削除されました。
ドキュメントの配列
要素としてドキュメントを含む配列がある場合は、ドキュメント内のデータに一致する条件を指定することで、それらのドキュメントを削除できます。
次のドキュメントを含むrestaurantsというコレクションがあるとします。
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
この場合、reviews
というフィールド ドキュメントの配列が含まれています。各ドキュメントは、問題のレストランの異なるレビューです。
$pull
を使用できます 特定の基準に一致するレビューを削除します。
例:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
出力:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
このメッセージは、3つのドキュメントがクエリ基準に一致し(すべてのドキュメントを選択したため)、2つのドキュメントが変更されたことを示しています(2つが$pull
に一致したため) 基準)。
コレクションをもう一度チェックして、効果を確認しましょう:
db.restaurants.find().pretty()
結果:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
評価が4以上のレビューのみが残っていることがわかります。 4未満のレビューはすべて削除されました。