MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

'Upsert' in einem eingebetteten Dokument

Sie können $addToSet verwenden, um zu einem Satz hinzuzufügen und sicherzustellen, dass es kein doppeltes Array-Element gibt, aber das wird für Ihren "aktualisierenden" Fall nicht funktionieren.

Um das zu tun, was Sie wollen, müssen Sie Ihre Datenstruktur in etwa ändern:

{
    "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
    "component_id" : 1,
    "_locales" : {
        "nl_NL" : {
            "url" : "dutch"
        }
    }
}

Jetzt können Sie ein Update auf dem Gebietsschema nl_NL mit nur:

durchführen
db.components.update( { component_id: 1 }, { $set: { '_locales.nl_NL.url' : 'new url' } }, true );

Und ein neues Gebietsschema wird auch funktionieren, wie zum Beispiel mit:

db.components.update( { component_id: 1 }, { $set: { '_locales.en_US.url' : 'American' } }, true );

Vielleicht möchten Sie erwägen, das Gebietsschema auch als Teil des verschachtelten Objekts zu haben, wie in:

{
    "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
    "component_id" : 1,
    "_locales" : {
        "nl_NL" : {
            "url" : "dutch"
            "locale" : "nl_NL"                 
        }
    }
}

Dies erleichtert in einigen Fällen das Abrufen von Daten.