MongoDBドキュメントからフィールドを完全に削除する方法は?


307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

これがドキュメントであるとします。wordsこのコレクションのすべてのドキュメントから「」を完全に削除するにはどうすればよいですか?すべてのドキュメントに " words"を付けないようにします。

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

回答:


532

これを試してください:あなたのコレクションが「例」だった場合

db.example.update({}, {$unset: {words:1}}, false, true);

これを参照してください:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

更新

上記のリンクは「$ unset」をカバーしていません。{multi: true}コレクション内のすべてのドキュメントからこのフィールドを削除する場合は、必ず追加してください。それ以外の場合は、一致する最初のドキュメントからのみ削除されます。更新されたドキュメントについては、これを参照してください。

https://docs.mongodb.com/manual/reference/operator/update/unset/

例:

db.example.update({}, {$unset: {words:1}} , {multi: true});

1
虚偽の説明については、この質問に対する解決策を参照してください/真 stackoverflow.com/questions/7714216/...
DSEL

1
このページのどこにも "Nic Cottrell"によるコメントはありません:)
Dan Dascalescu

6
午前私は何かが欠けている、またはので、8+年のこのでし間違っていtags.wordsなければなりません$unset、ありませんかwords?サルバドールダリの回答も参照してください。
Dan Dascalescu

1
また、使用することができるupdateMany代わりに、{multi:true}すなわち、db.example.updateMany({},{"$unset":{words:""}})
キップ

158

初めに、質問に賞金がある理由はわかりませんでした(私は質問に良い答えがあり、追加するものがないと思いました)、それから、受け入れられて15回賛成された答えは実際には間違っていることに気付きました!

はい、$unset演算子を使用する必要がありますが、これを設定解除すると、コレクションのドキュメントに存在しない単語キーが削除されます。したがって、基本的には何もしません。

したがって、Mongoにドキュメントタグを調べてから、ドット表記を使用して単語を調べるように指示する必要があります。正しいクエリです。

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

完了のために、これを行う別の方法を参照しますが、これはさらに悪いことですが、この方法では、任意のカスタムコードでフィールドを変更できます(このドキュメントの別のフィールドに基づいていても)。


2
これに加えて、タグが配列の場合、次のようになります:db.example.update({}、{$ unset:{'tags。$ []。words':1}}、false、true)
Mananシャー

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

これを使用して、複数のドキュメントを更新することもできます。


2
私はこれfalse, trueを最後の2つの引数として渡すよりも明確だupdate()
Kip

17

MongoDBのフィールドを削除または削除するには

  • 単一レコードの場合

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • マルチレコードの場合

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

私はこれと同様のことをしようとしましたが、代わりに埋め込みドキュメントから列を削除しました。解決策を見つけるのにしばらく時間がかかりました。これが最初に出会った投稿だったので、同じことをしようとしている人のためにここに投稿しようと思いました。

だから、代わりにあなたのデータが次のようになっているとしましょう:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

words埋め込みドキュメントから列を削除するには、次の操作を行います。

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

またはを使用して updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unset値が存在する場合にのみ、それを編集しますが、それは(あれば、それはチェック文句を言わない安全な航行を行うことはありませんtagsが存在するので、最初に存在する)埋め込まれた文書に必要とされています。

これは、バージョン3.6で導入されたすべての位置演算子$[])を使用します。


1

デフォルトでは、update()メソッドは単一のドキュメントを更新します。マルチパラメータを設定して、クエリ条件に一致するすべてのドキュメントを更新します。

バージョン3.6で変更されました。構文:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

例:

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

あなたの例では:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})

1

以降Mongo 4.2、少し異なる構文を使用することもできます。

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

更新も凝集パイプラインを受け入れることができる方法は、(集合パイプラインの使用を意味二乗ブラケットに注意してください)。

これは、$unset使用されている演算子が(「クエリ」とは対照的に)集約演算子であることを意味し、その構文はフィールドの配列を取ります。


1

PyMongo(Python mongo)のソリューション:

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);

0

そしてmongomapperのために、

  • ドキュメント:シャットオフ
  • 削除するフィールド:shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

MongoEngineを使用してフィールドを削除する方法を探しているときにこのページを見つけ続けたので、ここにもMongoEngineの方法を投稿すると役立つと思います。

Example.objects.all().update(unset__tags__words=1)


-3

「単語」が存在するかどうかを確認し、ドキュメントから削除する

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

trueは、一致した場合に複数のドキュメントを更新することを示します。


存在を確認する必要はありません。ドキュメント状態「フィールドが存在しない場合は、$解除は何も(すなわち無操作)を行いません。」:ということ
Dan Dascalescu 2018


-7

パッケージを参照してさまざまな「キー」を削除するには、これを試してください

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.