配列要素のObjectIdを介してそれを見つけるだけで、配列の要素を削除しようとしています。以下の「$ removeFromSet」に$ addToSetのMongoDBの反対側、私はやることができていたはず。
db.collection.update(
{name: 'nameOfNode'},
{$pull: { activities: ["5e7d16e9736bb64bdd158c13"]}})
または
db.collection.update(
{name: 'nameOfNode'},
{$pull: { activities: ["5e7d16e9736bb64bdd158c13", "Materi"]}})
しかし、上記の両方のコードは機能しません。1つの値だけでそれらを削除する別の方法がある場合、またはそれが不可能な場合は、2つの値でそれらを削除しますか?
注:スクリーンショットから一部の機密情報を削除したため、文字間の想定されるギャップはスペースではなく、カバーされたテキストです。私がそれらを参照するために使用しようとした文字列は同じですが、違いはありません。
コードに2つの問題があります。-値はactivities
配列のメンバーではなく、配列に含まれる配列のメンバーですactivities
-のような文字列を検索すると、activities: ["5e7d16e9736bb64bdd158c13"]
ObjectIdタイプの値と一致しません。
ObjectIdのマッチングの簡単なデモンストレーションを実行しました。
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d354ccede22b56b5335bc"), "name" : "nameOfNode", "activities" : [ [ ObjectId("5e7d354ccede22b56b5335b9"), "Check-in" ], [ ObjectId("5e7d354ccede22b56b5335ba"), "Materi" ], [ ObjectId("5e7d354ccede22b56b5335bb"), "Materi" ] ] }
MongoDB Enterprise replset:PRIMARY> db.updtest.update({"name" : "nameOfNode"},{$pull:{"activities.0":ObjectId("5e7d354ccede22b56b5335b9")}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d354ccede22b56b5335bc"), "name" : "nameOfNode", "activities" : [ [ "Check-in" ], [ ObjectId("5e7d354ccede22b56b5335ba"), "Materi" ], [ ObjectId("5e7d354ccede22b56b5335bb"), "Materi" ] ] }
これによりObjectId値は正常に削除されますが、含まれている配列は削除されないことに注意してください。これは、私が望んでいたことです。
MongoDB 4.2を使用している場合は$filter
、次のようにサブ要素全体を削除するために使用できます。
db.updtest.update(
{"name" : "nameOfNode"},
[ {$set:{
activities:{
$filter:{
input:"$activities",
cond:{$ne:["$this.0",ObjectId("5e7d16e9736bb64bdd158c13")]}
}
}
}}]
)
スキーマを変更できる場合は、アクティビティをサブ配列ではなくオブジェクトとして挿入します。たとえば、各アクティビティの形式{id:... type: ...}
がの場合、$ pullを使用して特定のIDを照合できます。
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d3939cede22b56b5335c4"), "name" : "nameOfNode", "activities" : [ { "id" : ObjectId("5e7d3939cede22b56b5335c1"), "type" : "Check-in" }, { "id" : ObjectId("5e7d3939cede22b56b5335c2"), "type" : "Materi" }, { "id" : ObjectId("5e7d3939cede22b56b5335c3"), "type" : "Materi" } ] }
MongoDB Enterprise replset:PRIMARY> db.updtest.update({"name" : "nameOfNode"},{$pull:{"activities":{id:ObjectId("5e7d3939cede22b56b5335c2")}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise replset:PRIMARY> db.updtest.find()
{ "_id" : ObjectId("5e7d3939cede22b56b5335c4"), "name" : "nameOfNode", "activities" : [ { "id" : ObjectId("5e7d3939cede22b56b5335c1"), "type" : "Check-in" }, { "id" : ObjectId("5e7d3939cede22b56b5335c3"), "type" : "Materi" } ] }
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加