{
name: 'book',
tags: {
words: ['abc','123'],
lat: 33,
long: 22
}
}
假设这是一个文档。我如何从这个集合中的所有文档中完全删除“单词”?我希望所有的文件都没有“文字”:
{
name: 'book',
tags: {
lat: 33,
long: 22
}
}
{
name: 'book',
tags: {
words: ['abc','123'],
lat: 33,
long: 22
}
}
假设这是一个文档。我如何从这个集合中的所有文档中完全删除“单词”?我希望所有的文件都没有“文字”:
{
name: 'book',
tags: {
lat: 33,
long: 22
}
}
当前回答
从Mongo 4.2开始,也可以使用稍微不同的语法:
// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.updateMany({}, [{ $unset: ["tags.words"] }])
// { name: "book", tags: { lat: 33, long: 22 } }
由于更新方法可以接受聚合管道(注意方括号表示使用聚合管道),这意味着这里使用的$unset操作符是聚合操作符(而不是“查询”操作符),其语法接受一个字段数组。
其他回答
要引用一个包并删除各种“键”, 试试这个
db['name1.name2.name3.Properties'].remove([
{
"key" : "name_key1"
},
{
"key" : "name_key2"
},
{
"key" : "name_key3"
}
)]
值得一提的是,如果你使用Typegoose/Mongoose,你的字段需要在你的模型中声明,否则$unset将默默失败。
在重构数据库后,这让我没有意识到。多余的字段不再在我的模型中,我正在运行$unset,但什么也没有发生。
因此,如果你正在进行一些重构,请确保在从模型中删除冗余字段之前将其$unset。
db.collection.updateMany({}, {$unset: {"fieldName": ""}})
updateMany要求每个文档都有一个匹配条件,因为我们传递的是{},它总是true。第二个参数使用$unset操作符删除每个文档中的必需字段。
要删除一个字段,您可以使用这个命令(这将应用于集合中的所有文档):
db.getCollection('example').update({}, {$unset: {Words:1}}, {multi: true});
在一个命令中删除多个字段:
db.getCollection('example').update({}, {$unset: {Words:1 ,Sentences:1}}, {multi: true});
db.example.updateMany({},{"$unset":{"tags.words":1}})
我们还可以使用它来更新多个文档。