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

Posted

技术标签:

【中文标题】如何从 MongoDB 文档中完全删除字段?【英文标题】:How to remove a field completely from a MongoDB document? 【发布时间】:2011-10-14 16:21:06 【问题描述】:
 
    name: 'book',
    tags: 
        words: ['abc','123'],
        lat: 33,
        long: 22
    

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

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

【问题讨论】:

【参考方案1】:

试试这个:如果您的收藏是“示例”

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

【讨论】:

看这个问题的解决方案来解释假/真***.com/questions/7714216/… 此页面上不再有“Nic Cottrell”的评论 :) 我是不是遗漏了什么,或者这已经错了 8 年多,因为 tags.words 应该是 $unset,而不是 words?另见萨尔瓦多·达利的回答。 你也可以用updateMany代替multi:true,即db.example.updateMany(,"$unset":words:"") 以下在我的情况下有效:db.example.update( , $unset: 'column_name':1, false, true )【参考方案2】:

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

是的,您必须使用$unset operator,但此取消设置将删除集合文档中不存在的 words 键。所以基本上它什么都不做。

所以你需要告诉 Mongo 查看文档标签,然后使用 dot notation 查看单词。所以正确的查询是。

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

为了完整起见,我将参考another way of doing it,这要糟糕得多,但这样您就可以使用任何自定义代码更改字段(甚至基于本文档中的另一个字段)。

【讨论】:

除此之外,如果 tags 是一个数组,那么它将是这样的: db.example.update(, $unset: 'tags.$[].words':1 ,假,真)【参考方案3】:
db.example.updateMany(,"$unset":"tags.words":1)

我们也可以使用它来更新多个文档。

【讨论】:

我发现这比将false, true 作为最后两个参数传递给update() 更清楚【参考方案4】:

在 MongoDB 中移除或删除字段

单条记录

db.getCollection('userData').update(, $unset: pi: 1)

用于多记录

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

【讨论】:

【参考方案5】:

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  

由于update 方法可以接受聚合管道(注意方括号表示使用聚合管道),这意味着这里使用的$unset 运算符是聚合操作符(与"query" one 相对) ,其语法采用字段数组。

【讨论】:

【参考方案6】:

PyMongo(Python mongo)的解决方案:

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

【讨论】:

【参考方案7】:

db.collection.updateMany(, $unset: "fieldName": "")

updateMany 要求每个文档都有一个匹配条件,因为我们传递 它始终为真。第二个参数使用 $unset 运算符来删除每个文档中的必填字段。

【讨论】:

【参考方案8】:

我试图做与此类似的事情,而是从嵌入文档中删除该列。我花了一段时间才找到解决方案,这是我遇到的第一个帖子,所以我想我会在这里为其他尝试这样做的人发布此帖子。

所以让我们说你的数据看起来像这样:

 
  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 positional operator ($[])

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

mongoDB shell 中,此代码可能会有所帮助:

db.collection.update(, $unset: fieldname: "" )

【讨论】:

【参考方案11】:

默认情况下,update() 方法更新单个文档。设置 Multi Parameter 更新所有符合查询条件的文档。

在 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)

【讨论】:

【参考方案12】:

对于 mongomapper,

文档:关闭 要删除的字段:shutoff_type

Shutoff.collection.update( , '$unset' =&gt; 'shutoff_type': 1 , :multi =&gt; true )

【讨论】:

【参考方案13】:

名称:'书', 标签: 词:['abc','123'], 纬度:33, 长:22

回答:

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

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

您不需要检查是否存在。 documentation states 表示:“如果该字段不存在,则 $unset 什么都不做(即不操作)。”【参考方案15】:

您也可以使用 3.4 的项目在聚合中执行此操作

$project: "tags.words": 0

【讨论】:

【参考方案16】:

要引用一个包并删除各种“键”, 试试这个

db['name1.name2.name3.Properties'].remove([

     "key" : "name_key1"
,

     "key" : "name_key2"
,

     "key" : "name_key3"

)]

【讨论】:

以上是关于如何从 MongoDB 文档中完全删除字段?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoDB 中的聚合删除集合中所有文档的特定字段

求助啊,tp下,mongodb如何查询后只返回某个字段值

如何使用 deleteMany() 从 mongoDB 中删除所有文档?

在Java中查询具有完全匹配字段MongoDB的数组元素

如何从 MongoDB 文档中的双重嵌套数组中删除元素。

在 mongoDB 中删除数组字段大小小于 3 的文档