2016-05-28 48 views
3

我有一個集合在這些文件中:重命名/更新特定標籤中的所有文檔

[{ 
    "_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 }) 

但是,這需要兩個單獨的查詢。

我該如何通過單詞聲明來實現?

+0

Comment by @cubbuk:注意這隻會更新文檔中第一個匹配的元素。因此,假設您可能在{tags:[「SQL」,「Java」,「SQL」]}等文檔中有重複的標籤,則上述查詢將僅更新第一個元素。您可以使用$ addToSet而不是$ push來保證文檔中不會出現重複標籤。 – qais

回答

3

您正在使用錯誤的操作符。您需要使用$set運算符和$位置更新運算符。此外,您應該使用updateMany(),因爲update()已在官方語言驅動程序中被棄用。

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

您可以使用$ operator更新文檔中的特定元素,並使用multi選項更新所有匹配的文檔。

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

請注意,這隻會更新文檔中第一個匹配的元素。因此,假設您在文檔中可能有重複標籤,例如{tags: ["SQL", "Java", "SQL"]},則上述查詢將僅更新第一個元素。您可以使用$addToSet而不是$push來確保文檔中不會有重複的標籤。