tengo este modelo:
const NeighborSchema = new Schema({ friends: [ { type: Schema.Types.ObjectId, ref: "users", }, ], date: { type: Date, default: Date.now, }, }); module.exports = Neighbor = mongoose.model("neighbor", NeighborSchema);Estoy tratando de ver si existe un amigo en amigos de todos los vecinos:
const mongoose = require("mongoose"); const ObjectId = mongoose.Types.ObjectId; const testIncludes = async () => { let neighbors = await Neighbor.find(); let friends_ids = []; neighbors.map((neighbor) => { const { friends } = neighbor; friends_ids = [...friends_ids, ...friends]; }); // Returns false for this const element_to_search = ObjectId("60dcbb29118ea36a4f3ce229"); // Returns false for this // const element_to_search = "60dcbb29118ea36a4f3ce229"; let is_element_found = friends_ids.includes(element_to_search); }; // Returns false in both cases testIncludes(); Aunque element_to_search se tomó directamente de la lista de arrays de friends_ids devueltos, cuando intento buscarlo usando include , devuelve false por alguna razón, ya sea que lo busque como String o como ObjectId .
¿Tienes idea de lo que está pasando?
Array.prototype.includes compara cada elemento con la muestra hasta que encuentra una coincidencia. Los objetos se consideran iguales solo si hacen referencia a la misma instancia de la clase. Cuando llama a un constructor const element_to_search = ObjectId("60dcbb29118ea36a4f3ce229"); crea una nueva instancia que nunca ha estado en la matriz, incluso si su valor es el mismo.
Necesitas comparar escalares. Cadenas por ejemplo:
friends_ids.map(f => f.toString()).includes("60dcbb29118ea36a4f3ce229"); o emita cadenas cuando construya los friends_ids en primer lugar para evitar el bucle adicional sobre la matriz.