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

TIM*_*MEX 277 database mongodb mongodb-query

{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}
Run Code Online (Sandbox Code Playgroud)

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

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*nak 484

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

db.example.update({}, {$unset: {words:1}}, false, true);
Run Code Online (Sandbox Code Playgroud)

请参考:

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});
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 updateMany 代替 {multi:true}`,即 `db.example.updateMany({},{"$unset":{words:""}})` (5认同)
  • 我是否缺少某些东西,或者8年来一直是错的,因为`tags.words`应该是`$ unset`而不是`words`?另请参阅萨尔瓦多·达利(Salvador Dali)的答案。 (2认同)
  • 为什么人们在更新的答案中保留不起作用的旧代码?我认为人们来这里是为了寻找答案,而不是向下滚动,阅读完整的答案来弄清楚十年前的情况。这在SO中很常见。 (2认同)

Sal*_*ali 152

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

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

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

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 31

db.collection.updateMany({}, {$unset: {"fieldName": ""}})
Run Code Online (Sandbox Code Playgroud)

updateMany每个文档都需要一个匹配条件,因为我们传递的是 {},所以它始终为 true。第二个参数使用$unset运算符删除每个文档中的必填字段。


Xav*_*hot 19

从 开始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 } }
Run Code Online (Sandbox Code Playgroud)

由于update方法可以接受聚合管道(注意方括号表示使用聚合管道),这意味着这里使用的运算符是聚合运算符(与“查询”运算符$unset相反),其语法采用一组字段。


Vir*_*tel 17

删除或删除MongoDB中的字段


Vip*_*pul 14

db.example.updateMany({},{"$unset":{"tags.words":1}})
Run Code Online (Sandbox Code Playgroud)

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

  • 我发现这比将“false, true”作为最后两个参数传递给“update()”更清楚 (4认同)

Kav*_*eri 8

要删除字段,您可以使用此命令。请注意,{multi: true}更改将应用​​于集合中的所有文档:

db.getCollection('example').update({}, {$unset: {Words:1}}, {multi: true});
Run Code Online (Sandbox Code Playgroud)

并在一个命令中删除多个字段:

db.getCollection('example').update({}, {$unset: {Words:1 ,Sentences:1}}, {multi: true});
Run Code Online (Sandbox Code Playgroud)


Jon*_*ner 5

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

假设您的数据如下所示:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

words要从嵌入文档中删除该列,请执行以下操作:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)
Run Code Online (Sandbox Code Playgroud)

或使用updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)
Run Code Online (Sandbox Code Playgroud)

仅当值存在时才会$unset对其进行编辑,但不会进行安全导航(它不会tags首先检查是否存在),因此嵌入文档需要存在。

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


Yak*_*eri 5

PyMongo(Python mongo)的解决方案:

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