sql >> Databasteknik >  >> NoSQL >> MongoDB

'upsert' i ett inbäddat dokument

Du kan använda $addToSet för att lägga till en uppsättning och se till att det inte finns något duplicerat array-element, men det kommer inte att fungera för ditt "uppdateringsfall".

För att göra vad du vill måste du ändra din datastruktur till något som:

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

Nu kan du göra en uppdatering på nl_NL-språket med bara:

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

Och en ny lokal kommer att fungera också, till exempel med:

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

Du kanske också vill överväga att ha lokalen som en del av det kapslade objektet, som i:

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

Detta gör det lättare att hämta data i vissa fall.




  1. Referera till andra dokument med sträng snarare än ObjectId

  2. Skapa nya Meteor-samlingar i farten

  3. vad är den genomsnittliga skillnaden mellan Nest och redis-namespace juveler när vi använder redis med rails/ruby

  4. Förstå MongoDB Client Timeout-alternativ