我试图通过这种方式创建一个用户文档:
// create the document ---------------
const id = mongoose.Types.ObjectId()
let userDoc = await Admin.create({ ...req.body, _id: id, by: id })
模式:
adminSchema = new mongoose.Schema({
// some other fields, firstName, lastName ... etc
by: {
type: mongoose.Schema.ObjectId,
ref: 'Admin',
required: [true, "the 'by' field is required"],
immutable: true,
}
}, { _id: false })
模型:
const Admin = mongoose.model('Admin', adminSchema, 'users')
- 我的schema没有
_id
属性。
现在我想让_id
字段和by
字段具有相同的值,这是一个服务器端生成的id。
Mongoose抛出这个错误:
Error: MongooseError:文档在保存之前必须有一个_id…/node_modules/猫鼬/lib/model.js: 291:18
更新:
我更新了我的问题,我添加了模式选项,现在我知道这个错误发生的原因了。这是因为我设置了_id: false
模式选项。但是我需要这个选项,因为我不想在我发送给客户端的响应中看到_id
s。有解决办法吗?因为这个选项看起来像是在做两件不相关的事情
Using Mongoose 6.4
我通过删除_id: false
模式类型选项来解决这个问题。
toObject: {
virtuals: true,
transform(doc, ret) {
delete ret._id
},
},
现在真正的问题是,为什么简单地添加选项_id: false
在没有Mongoose帮助的情况下在服务器端生成id时会导致Mongoose错误?
Error: MongooseError:文档在保存之前必须有一个_id…/node_modules/猫鼬/lib/model.js: 291:18
我部分地回答了我自己的问题,但是对于这个…我真的不知道。
根据您的评论,如果您希望用户收到的响应不包含_id
,您可以:
- 获取文档
- 删除
_id
属性并返回这个没有_id
的对象(或者创建一个新对象以避免问题)。
一个简单的例子是:
let responseDoc = await Admin.findOne({ _id: id });
delete responseDoc["_id"]
// responseDoc is now ready for use. Note that if I am not mistaken it is still a document.