Tengo un controlador simple que crea una publicación para un usuario. Otro esquema está vinculado a él. Cuando intento crear una nueva publicación, necesito obtener la identificación de la publicación para poder vincularla con otro esquema.
Aquí está el esquema:
const mongoose = require("mongoose"); const User = require("./User"); const View = require("./View"); const ArticleSchema = new mongoose.Schema({ title: { type: String, required: true, trim: true, }, body: { type: String, required: true, }, status: { type: String, default: "public", enum: ["public", "private"], }, user: { type: mongoose.Schema.Types.ObjectId, ref: "User", }, views: { type: mongoose.Schema.Types.ObjectId, ref: "View", }, createdAt: { type: Date, default: Date.now, }, }); module.exports = mongoose.model("Article", ArticleSchema);Está bien cuando quiero vincular el campo de usuario porque lo tengo almacenado en la memoria.
Pero el campo de vista requiere el postId de ese documento en particular. Y no puedo obtenerlo sin antes crear el documento.
Mi controlador de publicación de creación:
module.exports.createArticleController = async function (req, res) { try { req.body.user = req.User._id; const article = await Article.create(req.body).exec() res.redirect(`/${article.title}/${article._id}`); } catch (e) { console.error(e); } };Entonces mi pregunta es,
¿Cómo puedo obtener la identificación en el proceso de ejecución de model.create () para poder vincular la vista a esa identificación? Tal vez algo usando el operador this
No quiero usar la actualización después de crear.
Puede generar su propia identificación y guardarla
ObjectId id = new ObjectId()Puede obtener los Id. de objeto justo después de crear una instancia de Modelo o crear sus propios Id. de objeto y guardarlos.
Así es como lo logré:
module.exports.createArticleController = async function (req, res) { try { const instance = new Article(); instance.title = req.body.title; instance.body = req.body.body; instance.status = req.body.status; instance.user = req.User._id; instance.views = instance._id; const article = await instance.save(); if (article) { res.redirect(`/${article.title}/${article._id}`); } } catch (e) { console.error(e); } };O puede crearlos y guardarlos en la base de datos.
var mongoose = require('mongoose'); var myId = mongoose.Types.ObjectId(); const instance = new YourModel({_id: myId}) //use itsigue leyendo
¿Cómo obtengo la identificación del objeto en mongoose después de guardarlo?
Simplemente puede crear un objeto de esquema como este:
const task: TaskDocument = new this.taskSchema({ ...createTaskDto })Esto es de uno de mis proyectos, ya que el ObjectId de MongoDB se basa en la máquina operativa y el momento en que se crea, no necesita la base de datos para generar la identificación. Ahora puede acceder a task._id para obtener su identificación sin guardarla.