Mongodb 重命名/更新所有文档中的特定标记

Mongodb 重命名/更新所有文档中的特定标记,mongodb,mongodb-query,Mongodb,Mongodb Query,我收集了以下文件: [{ "_id" : ObjectId("57496afadc964de30a8084a1"), "name" : "MongoDB: The Definitive Guide", "tags" : [ "IT", "SQL" ] },{ "_id" : ObjectId("57496afadc964de30a8084a2"), "name" : "MongoDB Applied Design Patterns", "tags"

我收集了以下文件:

[{
    "_id" : ObjectId("57496afadc964de30a8084a1"),
    "name" : "MongoDB: The Definitive Guide",
    "tags" : [ "IT", "SQL" ]
},{
    "_id" : ObjectId("57496afadc964de30a8084a2"),
    "name" : "MongoDB Applied Design Patterns",
    "tags" : [ "SQL", "MongoDB" ]
}]
我需要将所有文档中的所有“SQL”标记重命名为“NoSQL”。我可以先添加新的标记名,然后删除需要更新的标记名:

  db.getCollection('Book').update(
    { tags: 'SQL' },
    { '$push': { tags: 'NoSQL' } },
    { multi: true })

  db.getCollection('Book').update(
    { tags: 'SQL' },
    { '$pull': { tags: 'SQL' } },
    { multi: true })
但这需要两个独立的查询


如何使用单个语句实现这一点?

您可以使用
$operator
更新文档中的特定元素,并使用
multi
选项更新所有匹配的文档

db.getCollection('Book').update(
{ tags: 'SQL' },
{ '$set': { "tags.$": 'NoSQL' } },
{ multi: true })

请注意,这只会更新文档中第一个匹配的元素。因此,假设文档中可能有重复的标记,例如
{tags:[“SQL”、“Java”、“SQL”]}
,上述查询将只更新第一个元素。您可以使用
$addToSet
而不是
$push
来保证文档中不会有重复的标记。

您使用了错误的运算符。您需要使用操作符和位置更新操作符。您还应该使用,因为官方语言驱动程序中不推荐使用
update()

db.getCollection('Book').updateMany(
    { 'tags': 'SQL' }, 
    { '$set': { 'tags.$': 'NoSQL' } }
)

@cubbuk注释:注意这只会更新文档中第一个匹配的元素。因此,假设文档中可能有重复的标记,例如{tags:[“SQL”、“Java”、“SQL”]},上述查询将只更新第一个元素。您可以使用$addToSet而不是$push来保证文档中不会有重复的标记。