schema option _id: false并且文档在保存错误发生之前必须有一个_id



我试图通过这种方式创建一个用户文档:

// 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模式选项。但是我需要这个选项,因为我不想在我发送给客户端的响应中看到_ids。有解决办法吗?因为这个选项看起来像是在做两件不相关的事情

Using Mongoose 6.4

我通过删除_id: false模式类型选项来解决这个问题。

为了从响应中删除_id,而不必使用_.omit()s或到处删除路由,我向模式添加了以下模式类型选项:
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.

相关内容

  • 没有找到相关文章

最新更新