Estoy ejecutando un servidor Node.js, conectándome a una base de datos MongoDB con mongoose. Dentro de mi controlador, tengo varios métodos que realizan operaciones en la base de datos. Uno de ellos es este:
async findMultiple(req, res) { const [baseSkillsArray] = Array(req.body); try { // if there is not baseSkillsArray, skip if (!baseSkillsArray) { return res.status(200).send([]); } // find all baseSkills using the ids in the baseSkillsArray const allBaseSkills = await BaseSkill.find({ _id: { $in: [baseSkillsArray.baseSkillArray] } // }); console.log('test ' + allBaseSkills); res.status(200).send(allBaseSkills); } catch (error) { console.error(error.message); res.status(500).send('Server error find BaseSkills'); } } Sin embargo, esto no me devuelve nada. Hice un poco de depuración y descubrí que el motivo es el id de búsqueda $in la matriz. Así que intenté codificar un valor, como '2', por ejemplo.
// find all baseSkills using the ids in the baseSkillsArray const allBaseSkills = await BaseSkill.find({ _id: { $in: ['2'] } });Sin éxito. Así que fui a MongoDB Atlas, donde se almacena mi base de datos. Intenté filtrar usando la misma línea de código en mis colecciones.
{ _id: { $in: ['2'] } }¡Sorprendentemente, me devuelve el documento como yo quería!
El problema es que necesito que funcione con mangosta. ¿Algunas ideas? ¿Es esto un error conocido?
No hay nada malo con la consulta, ni un error con respecto $in .
De hecho, lo que está mal es el nombre real de la colección. Creé manualmente una colección en MongoDB Atlas, llamada "baseSkills". Sin embargo, mongoose por defecto transforma el nombre de su colección en minúsculas y agrega una "s" si el nombre de su colección no está en plural.
Entonces, cada vez que iniciaba mi servidor, notaba que había una nueva colección llamada "baseskills". Supuse que era un error y lo eliminé. Solo después de hacer esta publicación me di cuenta de que la colección estaba allí nuevamente .
Así que exporté los documentos a esta colección y mi consulta funcionó bien.
FYI, hay una manera de hacer cumplir el nombre de la colección en mangosta. Cuando declare su modelo, agregue un segundo parámetro a la función Schema llamado "colección". Aquí hay un ejemplo:
const BaseSkillSchema = new mongoose.Schema({ _id: { type: String, required: true }, ... }, { collection: 'baseSkills' })¡Eso es todo! Perdona por el lío y gracias por tu ayuda!
desea consultar los identificadores de objetos de mongo db. Por lo tanto, debe crear un nuevo ObjectId para hacer eso.
import {Types} from 'mongoose'; { _id: { $in: [new Types.Object("2")] } } O si tiene 2 ID, uno generado y uno personalizado creado como id , puede consultar sin crear un nuevo objeto.
{ id: { $in: ['2'] } }