Я только что натолкнулся на сценарий, который я не знаю, как решить с существующей структурой моих документов.Как показано ниже, я, очевидно, могу решить эту проблему с помощью некоторого рефакторинга, но Мне интересно, как это можно решить наиболее эффективно и с учетом той же структуры .
Пожалуйста, обратите внимание, что этот вопросотличается от Как сделать атомарное обновление для EmbeddedDocument в ListField в MongoEngine?
Давайте предположим, что следующие модели:
class Scans(mongoengine.EmbeddedDocument):
peer = mongoengine.ReferenceField(Peers, required=True)
site = mongoengine.ReferenceField(Sites, required=True)
process_name = mongoengine.StringField(default=None)
documents = mongoengine.ListField(mongoengine.ReferenceField('Documents'))
is_complete = mongoengine.BooleanField(default=False)
to_start_at = mongoengine.DateTimeField()
started = mongoengine.DateTimeField()
finished = mongoengine.DateTimeField()
class ScanSettings(mongoengine.Document):
site = mongoengine.ReferenceField(Sites, required=True)
max_links = mongoengine.IntField(default=100)
max_size = mongoengine.IntField(default=1024)
mime_types = mongoengine.ListField(default=['text/html'])
is_active = mongoengine.BooleanField(default=True)
created = mongoengine.DateTimeField(default=datetime.datetime.now)
repeat = mongoengine.StringField(choices=REPEAT_PATTERN)
scans = mongoengine.EmbeddedDocumentListField(Scans)
Что я хотел бы сделатьли вставлять объект ScanSettings тогда и только тогда, когда все элементы полей сканирования - список вложенных документов сканирования - имеют в свою очередь уникальный список документов?Под уникальным я подразумеваю все элементы в списке на уровне базы данных, а не весь список - это было бы просто.
На простом английском языке, если во время вставки ScanSetting какой-либо элемент списка сканирования имеет экземплярпроверяет, какой список документов продублирован, тогда такой вставки быть не должно.Я имею в виду уникальность на уровне базы данных, принимая во внимание существующие записи, если таковые имеются.
Учитывая, что Mongo не поддерживает уникальность для всех элементов списка в одном и том же документе, я нахожу два решения:
Вариант A
Я выполняю рефакторинг своей "схемы" и делаю коллекцию сканов наследованной из документа, а не встроенного документа, и изменяю поле сканирования ScanSettings на ListField of ReferenceFields для сканирования документов.Тогда это легко, так как мне просто нужно сначала сохранить сканы, используя «Updates» с оператором «add_to_set» и опцией «upsert = True».Затем, как только операция будет одобрена, сохраните ScanSettings.Мне понадобится количество экземпляров сканирования, чтобы вставить + 1 запрос.
Опция B Я сохраняю ту же "схему", но каким-то образом генерирую уникальные идентификаторы для внедренного документа Сканирования.Затем перед любой вставкой параметров сканирования с непустым полем сканирования я извлекаю уже существующие записи, чтобы увидеть, есть ли идентификаторы объекта дублированного документа среди только что извлеченных записей и тех, которые нужно вставить.Другими словами, я бы проверял уникальность через Python, а не через MogoneEngine / Mongodb.Мне понадобится 2 x количество экземпляров сканирования для вставки (чтение + обновление с помощью add_set_operator) + 1 ScanSettings save
Опция C Игнорировать уникальность.Учитывая то, как будет структурирована моя модель, я почти уверен, что дубликатов не будет или, если они вообще есть, она будет незначительной.Затем разберитесь с дубликатами во время чтения.Для тех, кто похож на меня, пришедших из реляционных баз данных, это решение выглядит сложным.
Я новичок в Монго, поэтому я благодарен за любые комментарии.Спасибо.
PS: Я использую последнюю версию MongoEngine и бесплатную версию Mongodb.
Заранее большое спасибо.