2016-05-28 5 views
3

ich diese Dokumente in einer Sammlung haben:Umbenennen/update ein bestimmtes Tag in allen Dokumenten

[{ 
    "_id" : ObjectId("57496afadc964de30a8084a1"), 
    "name" : "MongoDB: The Definitive Guide", 
    "tags" : [ "IT", "SQL" ] 
},{ 
    "_id" : ObjectId("57496afadc964de30a8084a2"), 
    "name" : "MongoDB Applied Design Patterns", 
    "tags" : [ "SQL", "MongoDB" ] 
}] 

Ich brauche alle "SQL" Tags in allen Dokumenten "NoSQL" umzubenennen. Ich kann es tun, indem man zuerst die neuen Tag-Namen hinzufügen und dann den, zu entfernen, die aktualisiert werden muss:

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

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

Dies erfordert jedoch zwei getrennte Abfragen.

Wie kann ich dies mit einer einzigen Aussage erreichen?

+0

Kommentar von @cubbuk: Beachten Sie, dass dadurch nur das erste übereinstimmende Element in einem Dokument aktualisiert wird. Wenn Sie also doppelte Tags in einem Dokument wie {tags: ["SQL", "Java", "SQL"]} haben, aktualisiert die obige Abfrage nur das erste Element. Sie können $ addToSet anstelle von $ push verwenden, um sicherzustellen, dass in Ihren Dokumenten keine doppelten Tags vorkommen. – qais

Antwort

3

Sie verwenden die falschen Operatoren. Sie müssen den Operator $set und den Positionsaktualisierungsoperator $ verwenden. Außerdem sollten Sie updateMany() verwenden, da update() in offiziellen Sprachtreibern veraltet ist.

2

Sie können $ operator verwenden, um ein bestimmtes Element in einem Dokument zu aktualisieren, und mit der Option multi werden Sie alle übereinstimmenden Dokumente aktualisieren.

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

Beachten Sie, dass dies nur das erste verglichene Element in einem Dokument aktualisieren. Angenommen, Sie haben möglicherweise doppelte Tags in einem Dokument wie {tags: ["SQL", "Java", "SQL"]}, wird die obige Abfrage nur das erste Element aktualisieren. Sie können $addToSet anstelle von $push verwenden, um sicherzustellen, dass in Ihren Dokumenten keine doppelten Tags vorhanden sind.

Verwandte Themen