escritura a granel de mangosta

prefacio

Al realizar operaciones mongo, a veces las personas se sienten impotentes, por ejemplo: para actualizar una gran cantidad de datos, pero el contenido de cada actualización de datos es diferente; es necesario crear una gran cantidad de datos en lotes; las operaciones anteriores, si simplemente
use findIOneAndUpdate o guarde, en primer lugar, es muy difícil, requiere mucho tiempo y, en segundo lugar, usa muchos recursos;

Entonces, ¿hay alguna buena manera de reemplazarlo?

mongoose proporciona prevención de operaciones masivas de escritura masiva, este método admite la inserción, actualización y eliminación por lotes;

Por supuesto, ¡nadie piensa que las operaciones por lotes no pueden operar una pieza de datos por sí sola!

Uno: una pequeña explicación de bulkWrite

Texto original de Mongoose en bulkWrite: https://mongoosejs.com/docs/api.html#model_Model-bulkWrite

Sintaxis de la operación:

db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
    
    
      writeConcern : <document>,
      ordered : <boolean>
   }
)
parámetro tipo ¿Es obligatorio? describir
operaciones formación requerido bulkWrite() escribe una matriz de operaciones. Operaciones admitidas: insertOne, updateOne, updateMany, deleteOne, deleteMany, replaceOne
escribirPreocupación documento opcional documento de preocupación de escritura, si se omite, se usa la preocupación de escritura predeterminada, generalmente inútil
ordenado booleano opcional Indica si la instancia de mongod realiza operaciones en orden o fuera de orden. El valor por defecto es verdadero.

Sobre pedido

  • Si es verdadero, ejecutar en orden, ejecutar en orden y detenerse en el primer error, y detener la ejecución de operaciones subsiguientes si se encuentra un error (las operaciones subsiguientes no se ejecutarán)
  • Si es falso, ejecuta fuera de orden, ejecución paralela, si se encuentra un error, continuará ejecutando una operación hasta que todas las operaciones tengan éxito o fallen;

En resumen, personalmente te recomiendo que lo configures para que se ejecute fuera de orden, puedes usarlo de acuerdo a tus necesidades, y las operaciones y los valores de retorno se explicarán en detalle más adelante.

Dos: operación concreta

insertOne

Insertar un solo documento en la colección;

db.collection.bulkWrite( [
   {
    
     insertOne : {
    
     "document" : {
    
    } } },
  {
    
     insertOne : {
    
     "document" : {
    
    } } }
] ,{
    
    ordered:fasle})

db.collection.bulkWrite( [
   {
    
     insertOne : {
    
     "document" : {
    
    } } },
  {
    
     insertOne : {
    
     "document" : {
    
    } } }
])

campo Descripción

  • insertOne.document: La información del documento que debe insertarse, si el documento no contiene _id, se generará automáticamente;
  • ordered: ejecución facultativa, ordenada o desordenada;

actualizar uno

updateOne actualiza un solo documento en la colección que coincide con el filtro. Si coinciden varios documentos, updateOne solo actualiza el primer documento coincidente;

db.collection.bulkWrite( [
   {
    
     updateOne :
      {
    
    
         "filter" : {
    
    name:"bulkWrite6"},
         "update" : {
    
    $set:{
    
    age:19}},
         "upsert" :true
      }
   }
],{
    
    ordered:fasle} )


db.collection.bulkWrite( [
   {
    
     updateOne :
      {
    
    
         "filter" : {
    
    name:"bulkWrite6"},
         "update" : {
    
    $set:{
    
    age:19}},,
         "upsert" :true
      }
   }
] )

campo Descripción

  • updateOne.filter:objeto, requerido, condición de coincidencia;
  • updateOne.update:objeto, requerido, actualizar contenido, las operaciones ejecutables son: $set, $unset, $rename, etc.;
  • updateOne.upsert: booleano, opcional, el valor predeterminado es falso, si es verdadero, inserte un nuevo documento cuando no haya ninguna coincidencia;

actualizarmuchos

updateMany actualiza todos los documentos coincidentes de la colección;

db.collection.bulkWrite( [
   {
    
     updateMany :
      {
    
    
         "filter" : {
    
    name:"bulkWrite6"},
         "update" : {
    
    $set:{
    
    age:19}},
         "upsert" :true
      }
   }
],{
    
    ordered:fasle} )


db.collection.bulkWrite( [
   {
    
     updateMany :
      {
    
    
         "filter" : {
    
    name:"bulkWrite6"},
         "update" : {
    
    $set:{
    
    age:19}},,
         "upsert" :true
      }
   }
] )

campo Descripción

  • updateOne.filter:objeto, requerido, condición de coincidencia;
  • updateOne.update:objeto, requerido, actualizar contenido, las operaciones ejecutables son: $set, $unset, $rename, etc.;
  • updateOne.upsert: booleano, opcional, el valor predeterminado es falso, si es verdadero, inserte un filtro de documento

eliminarUno

deleteOne elimina un solo documento que coincida con el filtro en la colección. Si coinciden varios documentos, deleteOne solo eliminará un documento coincidente;

db.collection.bulkWrite([
   {
    
     deleteOne :  {
    
     "filter" : {
    
    age:19} } }
] )

campo Descripción

  • deleteOne.filter:objeto, requerido, elimine el primer documento que coincida con este filtro;

eliminarmuchos

deleteMany elimina todos los documentos que coinciden con el filtro en la colección;

db.collection.bulkWrite([
   {
    
     deleteMany :  {
    
     "filter" : {
    
    age:19} } }
] )

campo Descripción

  • deleteMany.filter:objeto, requerido, eliminar todos los documentos que coincidan con este filtro;

reemplazar uno

replaceOne reemplaza un solo documento en la colección que coincide con el filtro. Si coinciden varios documentos, replaceOne solo reemplazará un documento coincidente;

db.collection.bulkWrite([
   {
    
     replaceOne :
      {
    
    
         "filter" :{
    
    age:19},
         "replacement" : {
    
    age:20},
         "upsert" :true
      }
   }
] )

campo Descripción

  • updateOne.filter:objeto, requerido, reemplaza el primer documento que coincida con este filtro;
  • updateOne.update:objeto, requerido, contenido de reemplazo;
  • updateOne.upsert: booleano, opcional, el valor predeterminado es falso, si es verdadero, inserte un filtro de documento si no hay ningún documento coincidente

Tres: ventajas

  • Se pueden realizar diferentes operaciones en lotes al mismo tiempo, como agregar, modificar y eliminar;
  • La tasa de ejecución es más rápida que save, findOneAndUpdate, etc., porque bulkWrite envía múltiples solicitudes insertOne, updateOne, updateMany, replaceOne, deleteOne, etc. al servidor MongoDB en un solo comando, que es más rápido que enviar múltiples operaciones independientes, porque bulkWrite ( ) Solo hay un viaje de ida y vuelta a MongoDB, y cada operación independiente es un viaje de ida y vuelta a MongoDB.

Cuatro: la siguiente necesidad de prestar atención

  • El parámetro orderado, dado que se pueden mezclar varias operaciones al mismo tiempo en bulkWrite, entonces, si se usa la ejecución desordenada, puede causar que deleteOne o deleteMany eliminen más o menos documentos, dependiendo de si deleteOne o deleteMany está en insertOne, se ejecuta antes o después de las operaciones updateOne, updateMany o replaceOne.

como sigue:

db.collection.bulkWrite(
   [
      {
    
     insertOne : <document> },
      {
    
     updateOne : <document> },
      {
    
     updateMany : <document> },
      {
    
     replaceOne : <document> },
      {
    
     deleteOne : <document> },
      {
    
     deleteMany : <document> }
   ],
   {
    
     ordered : false }
)
  • Una operación de actualización (updateOne, updateMany) o reemplazo (replaceOne) no puede especificar un valor de _id diferente al del documento original;

Cinco: retorno de error

Los valores de retorno de error se dividen principalmente en dos tipos, retorno de error de ejecución ordenado ordenado y desordenado,
tome la siguiente inserción como ejemplo, los elementos primero, cuarto y quinto no existen, los elementos segundo y tercero El _id ya existe

error de ejecución en orden

db.collection.bulkWrite(
  [
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite10' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     _id: '6321a77b06e79133d99b926c', name: 'bulkWrite6' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     _id: '63227cde0795b55523c0e8ac', name: 'bulkWrite7' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite11' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite12' } }
    }
  ],
  {
    
     ordered: true }
);

Error de ejecución secuencial, solo hay un error en el valor de retorno, pero no se ejecutan los índices = 2, 3, 4 en los identificadores insertados.

{
    
    
        "code": 11000,
        "writeErrors": [
            {
    
    
                "code": 11000,
                "index": 1,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                "op": {
    
    
                    "name": "bulkWrite6",
                    "age": 0,
                    "register_time": "2022-09-15T03:45:04.529Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "6321a77b06e79133d99b926c"
                }
            }
        ],
        "result": {
    
    
            "ok": 1,
            "writeErrors": [
                {
    
    
                    "code": 11000,
                    "index": 1,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                    "op": {
    
    
                        "name": "bulkWrite6",
                        "age": 0,
                        "register_time": "2022-09-15T03:45:04.529Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "6321a77b06e79133d99b926c"
                    }
                }
            ],
            "writeConcernErrors": [],
            "insertedIds": [
                {
    
    
                    "index": 0,
                    "_id": "63229fc8afcdaac9bd268102"
                },
                {
    
    
                    "index": 1,
                    "_id": "6321a77b06e79133d99b926c"
                },
                {
    
    
                    "index": 2,
                    "_id": "63227cde0795b55523c0e8ac"
                },
                {
    
    
                    "index": 3,
                    "_id": "63229fc8afcdaac9bd268105"
                },
                {
    
    
                    "index": 4,
                    "_id": "63229fc8afcdaac9bd268106"
                }
            ],
            "nInserted": 1,
            "nUpserted": 0,
            "nMatched": 0,
            "nModified": 0,
            "nRemoved": 0,
            "upserted": []
        }
    }

error de ejecución fuera de orden

db.collection.bulkWrite(
  [
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite10' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     _id: '6321a77b06e79133d99b926c', name: 'bulkWrite6' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     _id: '63227cde0795b55523c0e8ac', name: 'bulkWrite7' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite11' } }
    },
    {
    
    
      insertOne: {
    
     document: {
    
     name: 'bulkWrite12' } }
    }
  ],
  {
    
     ordered: false }
);

Error de ejecución desordenada, se informan dos errores en el valor devuelto y tres inserciones se realizan correctamente

{
    
    
        "code": 11000,
        "writeErrors": [
            {
    
    
                "code": 11000,
                "index": 1,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                "op": {
    
    
                    "name": "bulkWrite6",
                    "age": 0,
                    "register_time": "2022-09-15T03:47:51.976Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "6321a77b06e79133d99b926c"
                }
            },
            {
    
    
                "code": 11000,
                "index": 2,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('63227cde0795b55523c0e8ac') }",
                "op": {
    
    
                    "name": "bulkWrite7",
                    "age": 0,
                    "register_time": "2022-09-15T03:47:51.976Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "63227cde0795b55523c0e8ac"
                }
            }
        ],
        "result": {
    
    
            "ok": 1,
            "writeErrors": [
                {
    
    
                    "code": 11000,
                    "index": 1,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                    "op": {
    
    
                        "name": "bulkWrite6",
                        "age": 0,
                        "register_time": "2022-09-15T03:47:51.976Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "6321a77b06e79133d99b926c"
                    }
                },
                {
    
    
                    "code": 11000,
                    "index": 2,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('63227cde0795b55523c0e8ac') }",
                    "op": {
    
    
                        "name": "bulkWrite7",
                        "age": 0,
                        "register_time": "2022-09-15T03:47:51.976Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "63227cde0795b55523c0e8ac"
                    }
                }
            ],
            "writeConcernErrors": [],
            "insertedIds": [
                {
    
    
                    "index": 0,
                    "_id": "6322a06b9145a56d3b23fabe"
                },
                {
    
    
                    "index": 1,
                    "_id": "6321a77b06e79133d99b926c"
                },
                {
    
    
                    "index": 2,
                    "_id": "63227cde0795b55523c0e8ac"
                },
                {
    
    
                    "index": 3,
                    "_id": "6322a06b9145a56d3b23fac1"
                },
                {
    
    
                    "index": 4,
                    "_id": "6322a06b9145a56d3b23fac2"
                }
            ],
            "nInserted": 3,
            "nUpserted": 0,
            "nMatched": 0,
            "nModified": 0,
            "nRemoved": 0,
            "upserted": []
        }
    }

Seis: pensando

Los escenarios en los que las personas suelen utilizar bulkWrite son:

  • Actualizar periódicamente los datos, como actualizar la información básica del personal, porque el contenido actualizado por cada persona es diferente;
  • Datos de pincel, algunos datos deben eliminarse, algunos deben actualizarse, algunos deben agregarse;

bulkWrite es un método de escritura más avanzado que guardar y actualizar, espero que pueda usarlo con flexibilidad.

cita

Texto original de Mongoose en bulkWrite: https://mongoosejs.com/docs/api.html#model_Model-bulkWrite

Supongo que te gusta

Origin blog.csdn.net/Long861774/article/details/126870563
Recomendado
Clasificación