Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
Cómo encontrar un documento de una ID de una matriz en JavaScript (Mangoose)

Tengo una función en mi servidor que se supone que recibe una publicación por su ID. La función funciona hasta la constante "foundPost", donde parece que no puedo encontrar uno de los documentos de la matriz "posts". Intenté sustituir findOne por find y los ObjectIds funcionan para la const 'post'. Verifiqué dos veces que post_id es 62067c1211eea1531d5872f4

Aquí está la función para encontrar una publicación:

 const postById = async (req, res) => { const userId = req.params.userId; const post_id = req.params.post_id; const posts = await Post.findOne({ user: userId }); console.log(posts); //see this below const foundPost = await posts.findOne({ "upload": post_id }); //error here console.log(foundPost); return res.json({ success: true, Post: foundPost }); };

Esto es lo que devuelve 'console.log(posts)':

 [ { upload: new ObjectId("623b681bdf85df9086417723"), edited: false, title: 'Test 1', description: 'testing post 1', name: 'John ', sharedPost: 0, }, { upload: new ObjectId("62067c1211eea1531d5872f4"), edited: false, title: 'Test 2', description: 'testing post 2', name: 'John ', sharedPost: 0, } ]

Espero que la función regrese:

 { success: true, { upload: new ObjectId("62067c1211eea1531d5872f4"), edited: false, title: 'Test 2', description: 'testing post 2', name: 'John ', sharedPost: 0, }, }

¿Alguien puede ver por qué la línea const foundPost = await posts.findOne({ "upload": post_id }); no funciona? Gracias por tu ayuda.

****** Respuesta a la respuesta ******

Hola, muchas gracias por tu respuesta, lamentablemente sigue dando error. Por favor, vea a continuación el modelo para el código que estoy usando:

 const PostSchema = new Schema({ user: { type: Schema.Types.ObjectId, ref: "user", }, post: [ { user: { type: Schema.Types.ObjectId, ref: "user", }, upload: { type: Schema.Types.ObjectId, ref: "upload", }, title: { type: String, }, description: { type: String, }, }, ], date: { type: Date, default: Date.now, }, });

Noté que usaste 'userProfile.posts' que adapté a 'userProfile.post' para que coincida con este esquema. Tampoco estoy seguro de si quería usar 'subdoc' o 'subDoc' en la línea 11 de su código, pero probé ambos con el mismo error para cada uno. Determiné que el código se atascó en const subDocs = userPosts.filter(filter); línea. Investigué el método .filter que usó y no puedo encontrar ningún error potencial. No está seguro de cuál es el problema.

Gracias

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El problema es que no puede ejecutar otra consulta mongo en objetos que fueron el resultado de una consulta anterior.

 //will return a single document if found, or null if not found. const posts = await Post.findOne({ user: userId }); //this will not work because at this point 'posts' will be either a Document or null value //So the object will not have the method 'findOne' available. const foundPost = await posts.findOne({ "upload": post_id });

La solución es tratar correctamente con los tipos de objetos que tienes.

A continuación se muestra una implementación funcional y segura que resuelve su problema:

 const userPosts = await Post.findOne({ user: userId }).exec(); if (!userPosts) { // document not found with provided userId return res.json({ success: false }); } //here we have a Document //check if document has 'posts' property and is an array if (userPosts.posts) { //filter the posts array const filter = function(subDoc) { return subdoc.upload === post_id } const subDocs = userPosts.filter(filter); //filter returns an array, so we must check if has itens //then we grab the first item if (subDocs.length > 0) { const foundPost = subDocs[0]; return res.json({ success: true, Post: foundPost }); } //subDoc not found, return correct response return res.json({ success: false }); }

Si su esquema de modelo Post es lo que se supone que es, este código funcionará perfectamente.

 const schema = mongoose.schema({ user: Number, posts: [{ upload: Number }] })

En caso de error, agregue el código de la estructura del esquema del modelo.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda