MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Актуализиране на списък с вградени документи в mongoengine

Не, със списък поле не можете да направите upsert в списък в една заявка. $addToSet няма да работи, тъй като сте променили post така че не можете да съвпаднете. Можете да кодирате това, но то създава състояние на състезание, при което има малък прозорец на възможност за грешка, напр.:

    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)

Първо се опитваме да актуализираме и ако не съществува, изпращаме към списъка - това е мястото, където има прозорец с възможност за стартиране на друг процес и потенциално изпращане на post в списъка.

Рискът може да е приемлив, но реалистично, мисля, че промяната на вашата схема е по-добра, потенциално разделяне на Post в собствената си колекция. След това можете да използвате израз за актуализиране и да зададете целия обект. Цената ще бъде допълнителна заявка за получаване на данните за емисиите.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да изтриете много колекции mongodb наведнъж?

  2. Защо MongoDB – 10 причини да научите MongoDB за 2022 г

  3. Как да върна броя на актуализираните обекти в mongodb?

  4. .get() изисква функции за обратно извикване, но има [недефиниран обект]

  5. Upsert Array Elements, съответстващи на критериите в документ на MongoDB?