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

问题描述 投票:0回答:4

我有一个简单的控制器,可以为用户创建帖子。另一个模式链接到它。当我尝试创建新帖子时,我需要获取帖子的 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 运算符

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

javascript node.js mongoose mongodb-query mongoose-schema
4个回答
1
投票

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

继续阅读

保存后如何获取mongoose中的对象Id。

Object Id 的格式及用途


0
投票

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

ObjectId id = new ObjectId()

0
投票

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

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

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


0
投票
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();
    ```
© www.soinside.com 2019 - 2024. All rights reserved.