1. ホーム
  2. mongodb

[解決済み] mongoDbで、配列の要素をインデックスで削除するにはどうしたらいいですか?

2022-12-02 07:17:54

質問

次の例では、ドキュメントが db.people コレクションにあるとします。

の3番目の要素を削除する方法 興味 配列の3番目の要素を インデックス ?

{
  "_id" : ObjectId("4d1cb5de451600000000497a"),           
  "name" : "dannie",  
  "interests" : [  
    "guitar",  
    "programming",           
    "gadgets",  
    "reading"  
  ]   
}

これは私の現在の解決策です。

var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

もっと直接的な方法はないのでしょうか?

どのように解決するのですか?

配列のインデックスを指定して引いたり外したりするストレートな方法はありません。実際、これは未解決の問題です。 http://jira.mongodb.org/browse/SERVER-1014 で、投票することができます。

回避策としては、$unsetを使用してから$pullを使用します。

db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
db.lists.update({}, {$pull : {"interests" : null}})

更新: いくつかのコメントで言及されたように、このアプローチはアトミックではなく、他のクライアントが2つの操作の間に読み取りや書き込みを行うと、いくつかのレースコンディションを引き起こす可能性があります。操作をアトミックにする必要がある場合は、可能です。

  • データベースからドキュメントを読み取る
  • ドキュメントを更新し、配列内の項目を削除する
  • データベース内のドキュメントを置き換えます。ドキュメントを読み込んでから変更されていないことを確認するには、 update if current パターンで記述された で説明されている