La idea es muy simple. Agrego 4 entradas en la colección 'frutas' dentro de 'frutasDB'. Cuando ejecuto server.js, en realidad agrega las entradas de la lista a la base de datos.
Cuando reviso la base de datos, dice que tengo 4 entradas [manzana, kiwi, naranja, plátano]. sin embargo, el método de búsqueda que es
Fruit.find(function(err, fruits){ if(err){ console.log(err); } else { console.log(fruits); } });
devuelve una matriz vacía cuando ejecuto server.js por primera vez. Si ejecuto server.js por segunda vez y compruebo las colecciones desde dentro de MongoDB, dado que es la segunda vez que ejecuto el contenido de la nueva colección, se muestra como
[manzana, kiwi, naranja, plátano, manzana, kiwi, naranja, plátano]
Esta vez, el método find() muestra la matriz, pero solo 4 de ellos... ¿Qué estoy haciendo mal aquí?
Servidor.js:
const mongoose = require('mongoose'); main().catch(err => console.log(err)); // This section means connect to mongodb and create fruitsDB database inside that async function main() { await mongoose.connect('mongodb://localhost:27017/fruitsDB'); } const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Fruit = mongoose.model('Fruit', fruitSchema); // MongoDB will automatically pluralize the collection name // const fruit = new Fruit({ // name: 'Apple', // rating: 7, // review: 'Pretty solid as fruit!' // }); // Comment out this section to prevent mongoose to // save fruit to fruits collection everytime you run server.js // fruit.save(); const peopleSchema = new mongoose.Schema({ name: String, age: Number }); const People = mongoose.model('People', peopleSchema); const people = new People({ name: 'John', age: 37 }); people.save(); const apple = new Fruit({ name: 'Apple', rating: 7, review: 'Pretty solid as fruit!' }); const kiwi = new Fruit({ name: 'Kiwi', rating: 10, review: 'The best fruit!' }); const orange = new Fruit({ name: 'Orange', rating: 4, review: 'Too sour for me!' }); const banana = new Fruit({ name: 'Banana', rating: 3, review: 'Weird texture!' }); Fruit.insertMany([apple, kiwi, orange, banana], function(error){ if(error){ console.log(error); } else { console.log('New entries are added to the database!'); } }); // Read the fruits collection Fruit.find(function(err, fruits){ if(err){ console.log(err); } else { console.log(fruits); } });
El método find() se ejecuta antes de que la base de datos tenga la oportunidad de almacenar los datos.
Puede almacenar la llamada insertMany() en una función asíncrona con await y poner su Fruit.find() después
async function myFunc() { await Fruit.insertMany([apple, kiwi, orange, banana], function (error) { if (error) { console.log(error); } else { console.log('New entries are added to the database!'); } }); Fruit.find(function (err, fruits) { if (err) { console.log(err); } else { console.log(fruits); } }); } myFunc();
O aproveche las devoluciones de llamada de Promise y use .then() .
myFunc().then(() => { Fruit.find(function (err, fruits) { if (err) { console.log(err); } else { console.log(fruits); } }); },err=> console.log(err));
Debe esperar a que Mongoose se conecte a su servidor MongoDB, y luego debe realizar toda la lógica. Lo que puede hacer es poner toda la lógica en la función main()
después await mongoose.connect('mongodb://localhost:27017/fruitsDB');
. Eso asegurará que Mongoose se conecte al servidor MongoDB antes de que se ejecute cualquier consulta DB.
const mongoose = require('mongoose'); main().catch(err => console.log(err)); // This section means connect to mongodb and create fruitsDB database inside that async function main() { await mongoose.connect('mongodb://localhost:27017/fruitsDB'); const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Fruit = mongoose.model('Fruit', fruitSchema); // MongoDB will automatically pluralize the collection name // const fruit = new Fruit({ // name: 'Apple', // rating: 7, // review: 'Pretty solid as fruit!' // }); // Comment out this section to prevent mongoose to // save fruit to fruits collection everytime you run server.js // fruit.save(); const peopleSchema = new mongoose.Schema({ name: String, age: Number }); const People = mongoose.model('People', peopleSchema); const people = new People({ name: 'John', age: 37 }); people.save(); const apple = new Fruit({ name: 'Apple', rating: 7, review: 'Pretty solid as fruit!' }); const kiwi = new Fruit({ name: 'Kiwi', rating: 10, review: 'The best fruit!' }); const orange = new Fruit({ name: 'Orange', rating: 4, review: 'Too sour for me!' }); const banana = new Fruit({ name: 'Banana', rating: 3, review: 'Weird texture!' }); Fruit.insertMany([apple, kiwi, orange, banana], function(error) { if (error) { console.log(error); } else { console.log('New entries are added to the database!'); } }); // Read the fruits collection Fruit.find(function(err, fruits) { if (err) { console.log(err); } else { console.log(fruits); } }); }