如何在mongoose中保存文档之前获取文档的id?

yftpprvb  于 12个月前  发布在  Go
关注(0)|答案(4)|浏览(122)

我有一个简单的控制器,可以为用户创建一个帖子。另一个架构与之链接。当我尝试创建一个新的post时,我需要获取post的id,这样我就可以将其他模式链接到它。
下面是schema:

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);

当我想链接user字段时,这是很好的,因为我已经将其存储在内存中。
但是view字段需要该特定文档的postId。如果不先创建文档,我就得不到它。
我的创建后控制器:

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);
  }
};

所以我的问题是
我如何在执行model.create()的过程中获得id,以便我可以将视图链接到该id。也许有些东西使用 *this * 运算符
我不想在创建后使用更新。

wmtdaxz3

wmtdaxz31#

您可以在创建Model示例后立即获取对象ID,或者创建自己的对象ID并保存它们。
我是这样做到的:

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);
  }
};

或者您可以创建它们并将其保存到数据库。

var mongoose = require('mongoose');
var myId = mongoose.Types.ObjectId();

const instance = new YourModel({_id: myId})

//use it

继续阅读
How do I get the object Id in mongoose after saving it.
Object Id's format and usage

7uzetpgm

7uzetpgm2#

您可以生成自己的id并保存它

ObjectId id = new ObjectId()
c6ubokkw

c6ubokkw3#

你可以像这样简单地创建一个schema对象:

const task: TaskDocument = new this.taskSchema({ ...createTaskDto })

这是来自我的一个项目,因为MongoDB的ObjectId是基于操作机器和创建时间的,它不需要数据库来生成ID。你现在可以访问task._id来获取你的id而不保存它。

kdfy810k

kdfy810k4#

interface NotificationModel extends mongoose.Model<NotificationDoc> {
  build(attrs: NotificationAttrs): NotificationDoc;
}

const notificationSchema = new mongoose.Schema(
  {
    sk: {
      type: Number,
    },
    createdAt: {
      type: mongoose.Schema.Types.Date,
    },
  },
  {
    shardKey: { sk: 1, createdAt: 1 },
    toJSON: {
      transform(doc, ret) {
        ret.id = ret._id;
        delete ret._id;
      },
    },
  }
); 

notificationSchema.statics.build = (attrs: NotificationAttrs) => {
  return new Notification(attrs);
};

const Notification = mongoose.model<NotificationDoc, NotificationModel>(
  'Notification',
  notificationSchema
);

export { Notification };

现在您可以先构建然后保存

const notification: NotificationAttrs = {
              sk: user,sk,
              createdAt: new Date(),
            };
const notificationDoc = Notification.build(notification);
console.log(notificationDoc.id)
await notificationDoc.save();
    ```

相关问题