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


评论


有关错误/正确的stackoverflow.com/questions/7714216/…的说明,请参阅此问题的解决方案。

– Dsel
2015年8月21日在6:41



此页面上的任何地方都不再有“ Nic Cottrell”发表评论了:)

– Dan Dascalescu
18/12/19在6:42

我是否缺少某些东西,或者这是8年以上的错误记录,因为tag.words应该是$ unset而不是word?另请参阅萨尔瓦多·达利(Salvador Dali)的答案。

– Dan Dascalescu
19年4月27日在4:04

您还可以使用updateMany代替{multi:true},即db.example.updateMany({},{“ $ unset”:{words:“”}})

–基普
19年11月14日15:52

#2 楼

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

是的,您必须使用$unset运算符,但是此未设置将删除集合文档中不存在的单词key。因此,基本上它什么也没做。所以正确的查询是。

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


为了完整起见,我将参考另一种方法,这要糟糕得多,但是通过这种方式使用任何自定义代码更改该字段(甚至基于本文档中的另一个字段)。

评论


除此之外,如果标签是一个数组,那么它将是这样的:db.example.update({},{$ unset:{'tags。$ []。words':1}},false,true)

– Manan Shah
18/12/21在6:34

#3 楼

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


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

评论


我发现这比传递false,true作为update()的最后两个参数更清晰

–基普
19年11月14日在20:01

#4 楼

删除或删除MongoDB中的字段



对于单个记录

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



对于多记录

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




#5 楼

PyMongo(Python mongo)的解决方案:

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


#6 楼

我试图做与此类似的事情,但是从嵌入式文档中删除了该列。我花了一段时间才找到解决方案,这是我遇到的第一篇文章,所以我想我会把这篇文章发给其他尝试这样做的人。

所以可以说,您的数据看起来像这样:

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

#7 楼

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


update方法也可以接受聚合管道(请注意方括号表示使用聚合

。这意味着正在使用的$unset运算符是聚合运算符(与“查询”运算符相反),其语法采用字段数组。

#8 楼

因为我在寻找使用MongoEngine删除字段的方法时一直在查找此页面,所以我想也可以在此处发布MongoEngine方式:

#9 楼

默认情况下,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})


#10 楼

对于mongomapper,


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

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

#11 楼

{
名称:'book',
标签:{
单词:['abc','123'],
纬度:33,
长:22
}
}

Ans:


#12 楼

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

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


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

评论


您无需检查是否存在。该文档指出:“如果该字段不存在,则$ unset不执行任何操作(即不执行任何操作)。”

– Dan Dascalescu
18/09/28'9:58

#13 楼

您还可以通过使用3.4的项目在聚合中进行此操作

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

#14 楼

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

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