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未満のレビューはすべて削除されました。