Al momento ho il seguente set di dati:'upsert' in un documento incorporato
{
'component_id':1,
'_locales':[
{
'url': 'dutch',
'locale': 'nl_NL'
}
] (etc)
}
Se voglio aggiornare la riga con il locale vorrei correre qualcosa di simile a:
db.components.update(
{'component_id': 1, '_locales.locale': 'nl_NL'},
{$set: {'_locales.$': {'url': 'new url','locale':'nl_NL'}},
true
);
questo funziona bene fino a quando il locale non esiste:
db.components.update(
{'component_id': 1, '_locales.locale': 'en_US'},
{$set: {'_locales.$': {'url': 'new url','locale':'en_US'}},
true
);
poiché non v'è un indice univoco component_id questo genera un ecce lamentandosi di una chiave duplicata.
C'è un modo per aggiungere automaticamente il nuovo 'documento' con una diversa localizzazione e aggiornarlo se esiste già? Secondo la documentazione utilizzando l'operatore di posizione non funzionerà con 'upserting'.
Ciao Derick, grazie per la risposta. Il tuo suggerimento era in realtà il mio datastructure iniziale che ho modificato in precedenza. Uno dei motivi era la creazione degli indici su: _locales.url piuttosto che su ogni locale: _locales.nl_NL.url, _locales.en_US.url ecc. Attualmente ho risolto questo ottenendo tutti i dati di _locales e modificando/aggiungendo il locale I sto lavorando con 'manualmente'. Quando ho finito, sostituisco l'attuale "_locales" con quello nuovo. Per ora questo è sufficiente, per quanto riguarda le prestazioni questa potrebbe non essere una buona idea. –
Sono d'accordo, avere una chiave "non definita" spesso non è una buona cosa a causa degli indici. A volte, è meglio fare due query per fare quell'aggiornamento se questo migliora le prestazioni a causa di indici/altri motivi negli altri casi. Non esiste un vero "modo corretto" il più delle volte. Gioca con esso, e se non lo fa cambia indietro ed esegui due query per l'aggiornamento. – Derick
@Derick: sto affrontando un problema simile. http://stackoverflow.com/questions/32038606/defining-a-map-with-objectid-key-and-array-of-strings-as-value-in-mongoose-schem –