回答:
これを試してください:あなたのコレクションが「例」だった場合
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});
tags.words
なければなりません$unset
、ありませんかwords
?サルバドールダリの回答も参照してください。
updateMany
代わりに、{multi:true}
すなわち、db.example.updateMany({},{"$unset":{words:""}})
初めに、質問に賞金がある理由はわかりませんでした(私は質問に良い答えがあり、追加するものがないと思いました)、それから、受け入れられて15回賛成された答えは実際には間違っていることに気付きました!
はい、$unset
演算子を使用する必要がありますが、これを設定解除すると、コレクションのドキュメントに存在しない単語キーが削除されます。したがって、基本的には何もしません。
したがって、Mongoにドキュメントタグを調べてから、ドット表記を使用して単語を調べるように指示する必要があります。正しいクエリです。
db.example.update(
{},
{ $unset: {'tags.words':1}},
false, true
)
完了のために、これを行う別の方法を参照しますが、これはさらに悪いことですが、この方法では、任意のカスタムコードでフィールドを変更できます(このドキュメントの別のフィールドに基づいていても)。
私はこれと同様のことをしようとしましたが、代わりに埋め込みドキュメントから列を削除しました。解決策を見つけるのにしばらく時間がかかりました。これが最初に出会った投稿だったので、同じことをしようとしている人のためにここに投稿しようと思いました。
だから、代わりにあなたのデータが次のようになっているとしましょう:
{
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
が存在するので、最初に存在する)埋め込まれた文書に必要とされています。
デフォルトでは、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})
以降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
使用されている演算子が(「クエリ」とは対照的に)集約演算子であることを意味し、その構文はフィールドの配列を取ります。
{名前: '本'、タグ:{単語:['abc'、 '123']、緯度:33、長さ:22}}
回答:
db.tablename.remove({'tags.words':['abc'、 '123']})
「単語」が存在するかどうかを確認し、ドキュメントから削除する
db.users.update({"tags.words" :{$exists: true}},
{$unset:{"tags.words":1}},false,true);
trueは、一致した場合に複数のドキュメントを更新することを示します。