web-dev-qa-db-ja.com

MongoDB文書からフィールドを完全に削除する方法

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

これが文書だとしましょう。このコレクションのすべての文書から "words"を完全に削除する方法を教えてください。すべての文書に "words"を付けないようにします。

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

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

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

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

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

UPDATE

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

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

例:

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

最初は、なぜその質問に恩恵があるのか​​わかりませんでしたが(質問にはいい答えがあり、追加するものは何もないと思いました)、それから15回受け入れられて投票された答えが実際に間違っていることに気付きました。

はい、あなたは $unset operator を使用しなければなりません、しかしこのアンセットはコレクションのドキュメントに存在しないwordsキーを削除しようとしています。だから基本的には何もしません。

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

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

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

145
Salvador Dali

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

  • シングルレコード用

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

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
15
Viral Patel
db.example.updateMany({},{"$unset":{"tags.words":1}})

これを使って複数の文書を更新することもできます。

11
Vipul

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 } }

pdate メソッドは、集約パイプラインを受け入れることもできます(集約パイプラインの使用を示す角括弧に注意してください)。

つまり、使用されている $unset 演算子は集約構文( "query" one とは対照的)であり、その構文はフィールドの配列を取ります。

1
Xavier Guihot

私はこれに似たことをしようとしていましたが、代わりに埋め込み文書から列を削除しました。解決策を見つけるのにしばらく時間がかかりましたが、これが私が出会った最初の投稿だったので、同じことを試みる他の人のためにここに投稿することにしました。

だから代わりにあなたのデータはこのように見えると言うことができます:

{ 
  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で導入された all position operator$[])を使用します。

1

そしてモンゴマッパーのために、

  • 文書:シャットオフ
  • 削除するフィールド:shutoff_type

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

0
Jon Kern

デフォルトでは、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})
0
Amitesh

{名前: 'book'、タグ:{単語:['abc'、 '123']、緯度:33、長さ:22}}

回答:

db.tablename.remove({'tags.words':['abc'、 '123']})

0
Poonam Agrawal