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

mongodb mongodb-query database

166752 观看

11回复

70749 作者的声誉

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

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

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
作者: TIMEX 的来源 发布者: 2011 年 7 月 27 日

回应 (11)


423

12653 作者的声誉

决定

试试这个:如果你的收藏是'例子'

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});
作者: Shaunak 发布者: 27.07.2011 10:32

140

118763 作者的声誉

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

是的,您必须使用$unset运算符,但是这个未设置将删除对于集合的文档不存在的单词key。所以基本上它什么都不做。

因此,您需要告诉Mongo查看文档标签,然后使用点表示法。所以正确的查询是。

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

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

作者: Salvador Dali 发布者: 10.11.2013 07:31

-3

4804 作者的声誉

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

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

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

作者: Abhi 发布者: 24.08.2014 10:05

-7

190 作者的声誉

要引用包并删除各种“键”,请尝试此操作

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
作者: aspadacio 发布者: 24.04.2015 04:41

16

543 作者的声誉

删除或删除MongoDB中的字段

  • 对于单个记录

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • 对于多记录

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
作者: Viral Patel 发布者: 21.05.2016 09:36

-4

1 作者的声誉

您也可以使用3.4中的项目进行聚合

{$ project:{“tags.words”:0}}

作者: joel Raja 发布者: 02.08.2017 08:49

10

484 作者的声誉

db.example.updateMany({},{"$unset":{"tags.words":1}})

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

作者: Vipul 发布者: 16.10.2017 01:41

0

1656 作者的声誉

默认情况下,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})
作者: Amitesh 发布者: 09.08.2018 06:07

0

9 作者的声誉

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

答:

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

作者: Poonam Agrawal 发布者: 30.10.2018 06:28

0

2436 作者的声誉

而对于mongomapper,

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

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

作者: Jon Kern 发布者: 03.02.2019 10:40

0

173 作者的声誉

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

所以,请说明您的数据如下所示:

{ 
  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中引入的全位置运算符$[]

作者: Jonathon Gardner 发布者: 11.04.2019 01:39
32x32