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

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

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

当前回答

要删除一个字段,您可以使用这个命令(这将应用于集合中的所有文档):

db.getCollection('example').update({}, {$unset: {Words:1}}, {multi: true});

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

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

其他回答

在mongoDB shell中,这段代码可能会有帮助:

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

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

是的,你必须使用$unset操作符,但是这个unset操作符将删除集合文档中不存在的words键。所以基本上它什么都不会做。

因此,您需要告诉Mongo在文档标记中查找,然后使用点表示法查找单词。正确的问题是。

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

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

默认情况下,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})
db.example.updateMany({},{"$unset":{"tags.words":1}})

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

您也可以使用3.4中的project在聚合中实现这一点

{$项目:{"标签。0}}