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