MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Aktualizacja listy osadzonych dokumentów w mongoengine

Nie z polem listy nie można wykonać upsert do listy w jednym zapytaniu. $addToSet nie będzie działać, ponieważ zmieniłeś post więc nie możesz dopasować. Możesz to ominąć, ale tworzy to sytuację wyścigu, w której istnieje małe okno możliwości błędu, np.:

    class Post(EmbeddedDocument):
        uid = StringField(required=True)
        text = StringField(required=True)

    class Feed(Document):
        label = StringField(required=True)
        feed_url = StringField(required=True)
        posts = ListField(EmbeddedDocumentField(Post))

    Feed.drop_collection()

    Feed(
        label="label",
        feed_url="www.feed.com"
    ).save()

    post = Post(uid='1', text="hi")
    updated = Feed.objects(posts__uid=post.uid).update_one(set__posts__S=post)
    if not updated:
        Feed.objects.update_one(push__posts=post)

Najpierw próbujemy zaktualizować, a jeśli nie istnieje, wypychamy na listę - w tym miejscu pojawia się okno możliwości uruchomienia innego procesu i potencjalnie wypchnięcia post na liście.

Ryzyko może być akceptowalne, ale realistycznie myślę, że zmiana schematu jest lepsza, potencjalnie dzieląc Post do własnej kolekcji. Następnie możesz użyć instrukcji aktualizacji i ustawić cały obiekt. Kosztem będzie dodatkowe zapytanie o dane kanału.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zaktualizować wiele pól obiektu tablicy za pomocą jednego żądania?

  2. Jak działa hideIndex() w MongoDB?

  3. Przełącz wartość logiczną za pomocą mongoDB

  4. jak przeszukiwać kolekcję mongodb w poszukiwaniu kluczy słownikowych zagnieżdżonych w tablicy?

  5. Wstawiaj dokumenty do MongoDB tylko wtedy, gdy wszystkie pola są unikalne