2011-10-27 15 views
6

Próbuję dodać nowe {pole: wartość} do wpisu na blogu. Na przykład, jeśli chcę zacząć śledzić wyświetlenia na stronach internetowych. Blog_posts.url: "http://www.example.com/01.html", jak mogę dodać ten atrybut wyświetleń do tego posta na blogu?MongoDB, dodaj nowe {pole: wartość} w istniejącym osadzonym dokumencie z notacją wielu kropek?

Moja obecna struktura dokumentu:

{ 
email_address: '[email protected]', 
password: 'random_password', 
first_name: 'John', 
last_name: 'Doe', 
user_type: 'WEBMASTER', 
newsletter: 'NO', 
websites: [{ 
    main_title: 'My Blog Website', 
    main_url: 'http://www.example.com', 
     blog_posts: [{ 
      url: 'http://www.example.com/01.html', 
      title:'My first blog post', 
      description: 'My first description.' 
     }, { 
      url: 'http://www.example.com/02.html', 
      title: 'My second blog post', 
      description: 'My second description.' 
     }, { 
      url: 'http://www.example.com/03.html', 
      title: 'My third blog post', 
      description: 'My third description.' 
     }, { 
      url: 'http://www.example.com/04.html', 
      title: 'My fourth blog post', 
      description: 'My fourth description.' 
     }] 
    }] 
} 

Oto co myślę będzie działać przy użyciu aktualizacji i podejmowania upsert PRAWDA.

db.my_collection.update ({ 'websites.blog_posts.url': 'http://www.example.com/01.html'}, { '$ zestaw': { 'websites.blog_posts. wyświetlenia: 549}}, true)

błąd, który otrzymałem to: * nie może dołączyć do tablicy przy użyciu nazwy pola string [blog_posts] *

może "$ zestaw" jest nie jest to poprawne, a może nie mogę odwoływać się do tego z notacją kropkową? Właśnie zacząłem używać MongoDB wczoraj, każda pomoc byłaby świetna.

Dziękujemy!

Odpowiedz

5

To, co próbujesz zrobić, nie jest możliwe, biorąc pod uwagę twój schemat. Notacja kropkowa może być wielopoziomowa, ale jeśli istnieje więcej niż jeden poziom, który jest tablicą, nie można już jej adresować za pomocą operatora pozycyjnego "$".

E.g. trzeba by zrobić:

db.my_collection.update( 
    {'websites.blog_posts.url': 'http://www.example.com/01.html' }, 
    {'$set': {'websites.$.blog_posts.$.impressions': 549}}, 
    true); 

Ale posiadanie dwóch operator położenia w aktualizacji nie jest możliwe, ponieważ MongoDB może określić tylko położenie elementu w pierwszej tablicy.

Jedyną opcją jest przeprojektowanie schematu, aby mieć dedykowaną kolekcję witryn użytkowników (co jest lepsze z innych powodów w tym przypadku).

+0

Masz rację, moim problemem był mój schemat i moje niepoprawne nawiasy do przechowywania osadzonego dokumentu. Zamiast tego użyłem nawiasów dla tablicy. Teraz z powodzeniem dodałem nowe pola o 4 poziomach głębokości, używając notacji kropkowej z odpowiednim schematem. – Chris

+0

Niesamowite, powodzenia;) –

Powiązane problemy