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

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

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

当前回答

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

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

其他回答

试试这个:如果你的收藏是“榜样”

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

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

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

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

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

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

值得一提的是,如果你使用Typegoose/Mongoose,你的字段需要在你的模型中声明,否则$unset将默默失败。

在重构数据库后,这让我没有意识到。多余的字段不再在我的模型中,我正在运行$unset,但什么也没有发生。

因此,如果你正在进行一些重构,请确保在从模型中删除冗余字段之前将其$unset。

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

由于更新方法可以接受聚合管道(注意方括号表示使用聚合管道),这意味着这里使用的$unset操作符是聚合操作符(而不是“查询”操作符),其语法接受一个字段数组。

对于monomapper来说,

文档:关闭 需要移除的字段:shutoff_type

Shutoff.collection。更新 ( {}, { '$ 设置' = >{“shutoff_type”:1}},:多= > true)