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


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

假设这是一个文档。如何words从此收藏集中的所有文档中完全删除“ ”?我希望所有文档都不含“ words”:

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

Answers:


531

尝试以下操作:如果您的收藏是“示例”

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吗?另请参阅萨尔瓦多·达利(Salvador Dali)的答案。
Dan Dascalescu

1
您也可以使用updateMany代替{multi:true},例如db.example.updateMany({},{"$unset":{words:""}})
Kip

158

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

是的,您必须使用$unsetoperator,但是此设置将要删除集合文档中不存在的单词key。所以基本上它什么也不会做。

因此,您需要告诉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最后两个参数传递给更清晰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运算符是聚合运算符(与“查询”运算符相反),其语法采用字段数组。



0

对于mongomapper,

  • 文件:关机
  • 要删除的字段:shutoff_type

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


0

因为在寻找使用MongoEngine删除字段的方法时一直找不到该页面,所以我想在这里发布MongoEngine的方法也可能会有所帮助:

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

-2

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

答:

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


-3

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

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

true表示如果匹配则更新多个文档。


您无需检查是否存在。该文档的状态是:“如果该字段不存在,那么$没有设置什么也不做(即无操作)。”
Dan Dascalescu


-7

要引用程序包并删除各种“键”,请尝试以下操作

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.