esto es lo que estoy pasando ahora mismo: estoy insertando algunos valores en una colección llamada frutas y justo después de que termine, quiero consola. Inicie sesión en cada uno de ellos con el mapa, el primero intente las salidas de la consola en lugar de una fruta (una sola colección object) todos los objetos de frutas (modelo o colección), pero cuando vuelvo a ejecutar el mismo código (para que agregue nuevamente los mismos valores a las frutas de la colección), la consola muestra los objetos de frutas que se han insertado antes, seguidos de más frutas. (modelo o colección) objeto. ¿Qué puedo hacer para poder hacer uso de los documentos que acabo de insertar en mi colección? Este es el código:
const db = require("mongoose"); const url = "mongodb://localhost:27017/personasDB"; db.connect(url); const fruitSchema = new db.Schema({ name:{ type: String, required: true, minlength: 3, maxlength: 20 }, price:{ type: Number, required:true, min: 0, max: 100 } }); const Fruit = db.model("fruits", fruitSchema); const fruits = ["pineapple", "apple", "banana", "orange"]; const prices = [12, 12.5, 4, 6.4]; for(let i = 0; i < fruits.length; i++){ const fruit = new Fruit({ name: fruits[i], price: prices[i] }); fruit.save(); } console.log(Fruit.find({}, function(err, elements){ if(err){ console.log(err); }else{ elements.map(fruit=>{ console.log(fruit); }); } }));después de volver a ejecutar el código, obtengo lo que quiero justo después de las primeras salidas
El problema es que el método save() es asíncrono. No puede actualizar su base de datos en una línea y asumir que ya ha cambiado en la siguiente. Es probable que registre los documentos sin cambios.
Podría intentar usar Array#map() para obtener una serie de promesas y esperar a que todos los documentos se guarden en paralelo usando Promise.all() . Una vez que se guardan todos los documentos, puede ir y usar Fruit.find() .
const fruits = ['pineapple', 'apple', 'banana', 'orange'] const prices = [12, 12.5, 4, 6.4] let promises = fruits.map((fruitName, i) => { const fruit = new Fruit({ name: fruitName, price: prices[i], }) return fruit.save() }) // Make sure, you're using `await` in an `async` function! await Promise.all(promises) // all the fruits are saved in the db console.log( Fruit.find({}, function (err, elements) { // ...