Puoi usare $addToSet per aggiungere a un set assicurandoti che non ci siano elementi di array duplicati, ma questo non funzionerà per il tuo caso di "aggiornamento".
Per fare ciò che vuoi, dovrai modificare la struttura dei dati in qualcosa del tipo:
{
"_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
"component_id" : 1,
"_locales" : {
"nl_NL" : {
"url" : "dutch"
}
}
}
Ora puoi eseguire un aggiornamento sulla locale nl_NL con solo:
db.components.update( { component_id: 1 }, { $set: { '_locales.nl_NL.url' : 'new url' } }, true );
E funzionerà anche una nuova lingua, ad esempio con:
db.components.update( { component_id: 1 }, { $set: { '_locales.en_US.url' : 'American' } }, true );
Potresti considerare di avere anche la locale come parte dell'oggetto nidificato, come in:
{
"_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
"component_id" : 1,
"_locales" : {
"nl_NL" : {
"url" : "dutch"
"locale" : "nl_NL"
}
}
}
Ciò semplifica il recupero dei dati in alcuni casi.