如何在将文档保存在猫鼬之前获取文档的 ID?

Posted

技术标签:

【中文标题】如何在将文档保存在猫鼬之前获取文档的 ID?【英文标题】:How to get the id of a document before even saving it in mongoose? 【发布时间】:2022-01-10 20:33:27 【问题描述】:

我有一个简单的控制器,可以为用户创建帖子。另一个模式链接到它。当我尝试创建新帖子时,我需要获取帖子的 ID,以便我可以将其他架构链接到它。

这是架构:

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 运算符

我不想在创建后使用更新。

【问题讨论】:

【参考方案1】:

你可以生成自己的id并保存

ObjectId id = new ObjectId()

【讨论】:

请详细说明您的回答。添加修改后的代码示例和说明。【参考方案2】:

您可以在创建模型实例后立即获取对象 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

【讨论】:

【参考方案3】:

您可以像这样简单地创建一个模式对象:

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

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

【讨论】:

以上是关于如何在将文档保存在猫鼬之前获取文档的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中获取 NumberLong 记录

如何仅在猫鼬中获取子文档?

如何仅在猫鼬中获取子文档?

如何在猫鼬中找到最新的子文档

如何使用聚合在猫鼬中对文档数组进行分页?

在猫鼬模式子文档中使用 async/await [重复]