Estoy insertando objetos a granel en MongoDB usando Mongoengine como este (código simplificado):
class Customer(Document): first_name = StringField(max_length=100) last_name = StringField(max_length=100) address = StringField(required=True) instances = [Customer(**{'name': 'John', 'last_name': 'Doe'})] Customer.objects.insert(instances)
Estoy insertando masivamente usando la lista de instancias de documentos creadas a partir de dictados. Como puede ver en el ejemplo anterior, la instancia del Cliente carece del campo de address
obligatorio. Sin embargo, se guarda en MongoDB de todos modos. Luego, en MongoDB hay un documento de Cliente sin la address
de campo requerida.
Mi pregunta: ¿Qué puedo hacer para que el esquema se valide al insertar de forma masiva? ¿Es un bucle for y una instance.save()
para cada instancia de Cliente mi única alternativa?
En la documentación de MongoEngine está escrito:
Por diseño, MongoEngine valida estrictamente los documentos justo antes de insertarlos en MongoDB y se asegura de que sean consistentes con los campos definidos en sus modelos.
así que estoy confundido por qué usar objects.insert()
no valida el documento. Sin embargo, más adelante en los documentos está escrito:
La validación se ejecuta al llamar a .validate() o .save()
Entonces, tal vez por objects.insert()
no valida documentos y antes de la inserción masiva debería haber un ciclo que recorre todas las instancias y llama a validate()
?
Cuando llama a Customer.objects
, lo que se devuelve es en realidad un QuerySet
. Desafortunadamente, el método QuerySet.insert
(documentos aquí ) no tiene opción de validación.
Su idea de validar previamente e insertar masivamente parece ser la mejor opción:
instances = [] for instance in [{'name': 'John', 'last_name': 'Doe'}]: customer = Customer(**instance) customer.validate() instances.append(customer) Customer.objects.insert(instances)
Esto es mucho más rápido que llamar a save
en cada instancia.