我有一个简单的控制器,可以为用户创建帖子。另一个模式链接到它。当我尝试创建新帖子时,我需要获取帖子的 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 运算符
我不想在创建后使用更新。
您可以在创建模型实例后立即获取对象 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
继续阅读
您可以生成自己的id并保存
ObjectId id = new ObjectId()
您可以像这样简单地创建一个模式对象:
const task: TaskDocument = new this.taskSchema({ ...createTaskDto })
这是我的一个项目,由于MongoDB中的ObjectId是基于操作系统和创建时间的,所以不需要数据库来生成id。 您现在可以访问 task._id 来获取您的 ID,而无需保存它。
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();
```