He insertado 100k registros, he subido registros por lotes con éxito. Pero, si uso bulk.insert(doc) , el valor predeterminado no se inserta con mongoose y Nodejs. como el campo createdAt y updatedAt como valor predeterminado no insertado. Intento agregar las opciones setDefaultsOnInsert: true bulk.insert sin opción para agregar el valor. Actualmente, agregué mi código. Por favor, ayúdame para avanzar.
let data = req.body; var bulk = callDispositionModel.collection.initializeOrderedBulkOp(); var counter=0 data.forEach(doc1 => { bulk.insert(doc1); if (counter % 5000 == 0) { bulk.execute(); bulk = callDispositionModel.collection.initializeUnorderedBulkOp(); counter = 0; } counter++ }) if (counter > 0) { bulk.execute(function(err,result) { if(err){ console.log(`err `, err) }else{ console.log(`result `, result) return res.send({success: true, message:'data uploaded successfully') } }); } let dispositionSchema = new mongoose.Schema({ name : {type: String, default: null}, mobile : {type : String, default: null}, remarks : {type: String, default:null}, duration: {type : String, default: null}, amount : {type : Number, default: 0}, date : {type : String, default: null}, time : {type : String, default: null}, createdAt: {type: Date, default: Date.now }, updatedAt: {type: Date, default: Date.now } }); const disposition = mongoose.model('disposition', dispositionSchema); export default disposition;Se inserta los datos en mongodb
{ "_id" : ObjectId("6098e6d007e2804b9c1f8317"), "name" : "senthil", "amount" : 0 } { "_id" : ObjectId("6098e6d007e2804b9c1f8316"), "name" : "periyas", "amount" : 0 }Pero, he esperado la salida.
Datos esperados
{ "_id" : ObjectId("6098e6d007e2804b9c1f8317"), "name" : "senthil", "amount" : 0, "mobile" : null, "remarks" : null, "createdAt": "2021-05-07T13:55:34.233Z" }, { "_id" : ObjectId("6098e6d007e2804b9c1f8316"), "name" : "periyas", "mobile" : null, "remarks" : null, "createdAt": "2021-05-07T13:55:34.233Z" }Hay una solicitud de soporte de inserción masiva en mongoose github , y lea uno de los comentarios del moderador:
Los métodos de API
initializeUnorderedBulkOp()einitializeOrderedBulkOp(), que están "en desuso" por mongodb. Ha sido reemplazada por la API bulkWrite() , que es parte de la especificación CRUD central de MongoDB y, por lo tanto, se implementa mucho más ampliamente. En particular, mongoose tiene una función Model.bulkWrite() a partir de 4.9.0 que tiene validación, conversión, promesas y despoblación de referencias.
Puedes usar bulkWrite() algo como:
let data = req.body; let bulk = []; data.forEach((doc1) => { bulk.push({ "insertOne": { "document": doc1 } }); if (bulk.length === 5000) { callDispositionModel.bulkWrite(bulk).then((result) => {}); bulk = []; } }) if (bulk.length > 0) { callDispositionModel.bulkWrite(bulk).then((res) => { console.log(res.insertedCount); return res.send({success: true, message: 'all data uploaded successfully'}) }); }Cambio
let dispositionSchema = new mongoose.Schema({ name : {type: String, default: null}, mobile : {type : String, default: null}, remarks : {type: String, default:null}, duration: {type : String, default: null}, amount : {type : Number, default: 0}, date : {type : String, default: null}, time : {type : String, default: null}, createdAt: {type: Date, default: Date.now }, updatedAt: {type: Date, default: Date.now } });Para
let dispositionSchema = new mongoose.Schema({ name : {type: String, default: null}, mobile : {type : String, default: null}, remarks : {type: String, default:null}, duration: {type : String, default: null}, amount : {type : Number, default: 0}, date : {type : String, default: null}, time : {type : String, default: null}, createdAt: {type: Date, default: Date.now }, updatedAt: {type: Date, default: Date.now } }, { timestamps: { createdAt: 'createdAt' , updatedAt: 'updatedAt'} });ahora puede configurar una opción de marcas de tiempo en el esquema para que Mongoose maneje esto por usted:
var dispositionSchema = new Schema({..}, { timestamps: true });