Me pregunto si puede completar dinámicamente en profundidad con MongoDB, específicamente estoy usando mongoose en una aplicación express. Estoy tratando de construir un clon básico de reddit. En mi modelo Post, estoy tratando de crear una cadena de respuesta. Las respuestas podrían anidarse, ya que alguien podría responder a una respuesta de una respuesta. ¿Puedo completar esa cadena de respuesta? Solo puedo averiguar cómo completar la primera capa de respuestas. Según la lectura de la documentación y la observación de otras respuestas en el desbordamiento de la pila, no creo que esto sea posible, pero quería plantear la pregunta antes de remodelar mis datos. Aquí está mi modelo de publicación:
const postSchema = new mongoose.Schema( { content: { type: String, required: [true, 'A post can not be empty'], }, thread: { type: mongoose.Schema.ObjectId, ref: 'Thread', }, isReply: { type: Boolean, default: false, }, parentPost: { type: mongoose.Schema.ObjectId, ref: 'Post', }, }, { toJSON: { virtuals: true }, toObject: { virtuals: true }, } ); postSchema.virtual('replies', { ref: 'Post', foreignField: 'parentPost', localField: '_id', });Y el controlador de subprocesos donde estoy haciendo la consulta y tratando de completar la cadena de respuesta:
exports.getThread = factory.getOne(Thread, 'thread', { path: 'posts', // Deep populate the replies from each post populate: { path: 'replies' }, }); // This is the factory getOne function exports.getOne = (Model, modelName, popOptions) => catchAsync(async (req, res, next) => { const query = popOptions ? Model.findById(req.params.id).populate(popOptions) : Model.findById(req.params.id); const doc = await query; if (!doc) return next( new AppError(`No ${modelName} could be found with that id`, 404) ); res.status(200).json({ status: 'success', data: { [modelName]: doc }, }); });El comportamiento deseado no está integrado en la mangosta.
También aconsejaría contra una estructura de datos que lo haga necesario. ¿Consideró otras estructuras de árbol de documentos (puede encontrar muchos ejemplos aquí o consultar el docu de mongodb)? Encuentro que los árboles con referencias a los padres son más útiles para los comentarios.
Pero volvamos a la población recursiva:
Por lo general, no querrá una consulta que pueda devolver cantidades impredecibles de datos. ¡Así que solo haga esto si limita la cantidad de documentos devueltos!
Hay otra pregunta que proporciona algunos ejemplos de implementaciones personalizadas de población de relaciones recursivas ( enlace )