如何从MongoDB文档中完全删除一个字段?

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

假设这是一个文档。我如何从这个集合中的所有文档中完全删除“words”?我希望所有文档都没有"words":

 {
name: 'book',
tags: {
lat: 33,
long: 22
}
}
392129 次浏览

试试这个:如果你的收藏是“榜样”

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

一开始,我不明白为什么这个问题有赏金(我认为这个问题有一个很好的答案,没有什么可以补充的),但后来我注意到,被接受并被赞了15次的答案实际上是错误的!

是的,你必须使用$unset运营商,但是这个unset将删除一个集合的文档中不存在的words键。所以基本上它什么都不会做。

所以你需要告诉Mongo在文档标签中查找,然后使用点符号查找单词。正确的问题是。

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

只是为了完成,我将引用另一种方法,这是更糟糕的,但这样你可以用任何自定义代码更改字段(甚至基于本文档中的另一个字段)。

检查“words”是否存在,然后从文档中删除

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

True表示匹配时更新多个文档。

引用一个包并删除各种“键”, 试试这个< / p >

db['name1.name2.name3.Properties'].remove([
{
"key" : "name_key1"
},
{
"key" : "name_key2"
},
{
"key" : "name_key3"
}
)]

删除或删除MongoDB中的字段

  • 为单张唱片

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • For Multi Record

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

您也可以使用3.4中的project在聚合中实现这一点

{$项目:{"标签。0}}

db.example.updateMany({},{"$unset":{"tags.words":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})
< p > { 名称:“书”, 标签:{ 词:[' abc ', ' 123 '), 纬度:33岁 长:22 } } < / p >

答:

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

对于monomapper来说,

  • 文档:关闭
  • 需要移除的字段:shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => 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是否存在),因此在嵌入的文档中需要exists。

这使用了3.6版中引入的所有位置运算符 ($[])

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操作符是聚合操作符(而不是“query"一个),其语法接受一个字段数组。

PyMongo (Python mongo)的解决方案:

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

因为我一直在寻找使用蒙古引擎删除字段的方法时找到这个页面,我猜在这里发布蒙古引擎的方式也可能有帮助:

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

mongoDB shell中,这段代码可能会有帮助:

db.collection.update({}, {$unset: {fieldname: ""}} )
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});

值得一提的是,如果你使用Typegoose/Mongoose,你的字段需要在你的模型中声明,否则$unset将默默失败。

在重构数据库后,这让我没有意识到。多余的字段不再在我的模型中,我正在运行$unset,但什么也没有发生。

因此,如果你正在做一些重构,请确保你$unset你的冗余字段之前从模型中删除它们。