Mam schemat dokumentu w MongoDB, który wygląda tak:Aktualizacja wielu zagnieżdżonych tablicy w MongoDB
{
_id: 1
tags: [{
tag: 'foo'
links: [{
link: 'http:www.google.com'
date: '123'
}]
}]
}
próbuję wcisnąć link do tablicy „linki”, który będzie przypisany do dokumentu.
Moje pierwsze zapytanie ...
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo'}}},
{upsert: true}
)
Daje mi to tworzy tag (jeśli nie istnieje)
{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }
Następnie postępuj że z tego zapytania ...
db.userlinks.update (
{_id: 1, tags: {tag: 'foo', links: {$nin: [{link: 'http://www.google.com'}]}}},
{$push: {tags: {tag: 'foo', links: {link: 'http://www.google.com', date: '123'}}}},
{upsert: true}
)
Ale otrzymuję ten błąd: "nie można stosować $ Push/$ pushAll modyfikator do braku tablicy"
Jestem prawie pewien, że problem jest w "aktualizacji" składnik mojego drugiego zapytania, ale nie jestem pewien, jak to naprawić. Każda pomoc będzie doceniona.
EDIT
Moje pierwsze zapytanie jest teraz ... (dzięki Joe)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
Moje drugie zapytanie jest teraz ...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
Który skutecznie odpycha link do tablica "łączy", ale pozwala również na duplikaty. Nie mogę pozwolić na duplikowanie linków. $ addToSet rodzaj prac, jednak jeśli data się zmieni, to nadal wstawi zduplikowany link.
Czy istnieje sposób sprawdzenia istnienia łącza w części "zapytanie" mojego drugiego zapytania, czy zamiast tego tylko addToSet, jeśli pewne pola są zgodne?
Nie możesz. rozważ zmianę schematu? –
Nie chcę zmieniać schematu, ponieważ jest on dokładnie taki, jaki jest jego format wyjściowy, co oznacza, że nie muszę wykonywać żadnych danych, gdy tylko wydobędę go z bazy danych. Myślałem, że to miał być główny powód używania Mongodb? Możliwość modelowania obiektów bezpośrednio do bazy danych iz bazy danych. –