Obecnie mam następujący zestaw danych:„upsert” w osadzonym dokumentu
{
'component_id':1,
'_locales':[
{
'url': 'dutch',
'locale': 'nl_NL'
}
] (etc)
}
Jeśli chcę zaktualizować wiersz z lokalizacji chciałbym uruchomić coś podobnego do:
db.components.update(
{'component_id': 1, '_locales.locale': 'nl_NL'},
{$set: {'_locales.$': {'url': 'new url','locale':'nl_NL'}},
true
);
to działa fine aż locale nie istnieje:
db.components.update(
{'component_id': 1, '_locales.locale': 'en_US'},
{$set: {'_locales.$': {'url': 'new url','locale':'en_US'}},
true
);
ponieważ istnieje indeks unikatowy na component_id ten wygeneruje excep narzekanie na duplikat klucza.
Czy istnieje sposób automatycznego dodania nowego "dokumentu" w innym miejscu i zaktualizowania go, jeśli już istnieje? Zgodnie z dokumentacją za pomocą operatora pozycji nie będzie działać z "upsertingiem".
Cześć Derick, dziękuję za odpowiedź. Twoja sugestia była w rzeczywistości moją początkową strukturą danych, którą zmieniono na powyższą. Jednym z powodów było tworzenie indeksów na: _locales.url zamiast na wszystkich lokalizacjach: _locales.nl_NL.url, _locales.en_US.url itp. Obecnie rozwiązałem to poprzez uzyskanie wszystkich danych _locales i modyfikowanie/dodanie ustawień narodowych I "Pracuję z" ręcznie ". Kiedy skończyłem, zastępuję obecną "_locales" nową. Na razie to wystarczy, jeśli chodzi o wydajność, może to nie być dobry pomysł. –
Zgadzam się, posiadanie "niezdefiniowanego" klucza nie jest często dobrym rozwiązaniem ze względu na indeksy. Czasami lepiej jest zrobić dwa zapytania, aby wykonać tę aktualizację, jeśli poprawia to wydajność z powodu indeksów/innych przyczyn w innych przypadkach. Przez większość czasu nie ma prawdziwej "właściwej drogi". Zagraj z nim, a jeśli nie działa, zmień go i uruchom dwa zapytania do aktualizacji. – Derick
@Derick: Mam podobny problem. http://stackoverflow.com/questions/32038606/defining-a-map-with-objectid-key-and-array-of-strings-as-value-in-mongoose-schem –