Answers:
尝试以下操作:如果您的收藏是“示例”
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});
tags.words
应该$unset
,不是words
吗?另请参阅萨尔瓦多·达利(Salvador Dali)的答案。
updateMany
代替{multi:true}
,例如db.example.updateMany({},{"$unset":{words:""}})
一开始,我不明白为什么这个问题有一个赏金(我认为这个问题有一个不错的答案,没有什么可补充的),但是后来我注意到,被接受并赞成15次的答案实际上是错误的!
是的,您必须使用$unset
operator,但是此设置将要删除集合文档中不存在的单词key。所以基本上它什么也不会做。
因此,您需要告诉Mongo首先查看文档标签,然后再使用点符号查找单词。因此正确的查询是。
db.example.update(
{},
{ $unset: {'tags.words':1}},
false, true
)
仅出于完成的目的,我将介绍另一种处理方法,这种方法会更糟,但是通过这种方法,您可以使用任何自定义代码(甚至基于本文档中的另一个字段)来更改字段。
我试图做与此类似的事情,但是从嵌入式文档中删除了该列。我花了一段时间才找到解决方案,这是我遇到的第一篇文章,所以我认为我会把这篇文章发给其他尝试这样做的人。
因此,可以说您的数据如下所示:
{
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中引入的所有位置运算符($[]
)
默认情况下,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})
从开始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 } }
该更新方法还可以接受的聚合管道(注意,方括号标志着使用聚合管道)。
PyMongo(Python mongo)的解决方案:
db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
{name:'book',tags:{words:['abc','123'],lat:33,long:22}}
答:
db.tablename.remove({'tags.words':['abc','123']})
检查是否存在“单词”,然后从文档中删除
db.users.update({"tags.words" :{$exists: true}},
{$unset:{"tags.words":1}},false,true);
true表示如果匹配则更新多个文档。
您也可以通过使用3.4版的项目进行汇总
{$ project:{“ tags.words”:0}}