Node.js MongoDB-错误:文档在保存之前必须具有_id
我一直在为这个项目苦苦挣扎。我正在学习一个在某些领域已经过时的教程,例如,他们版本的Jquery对某些函数使用了完全不同的格式,我不得不做了很多改变。但我认为我陷入了最后一个似乎无法解决的主要问题。在我的模式变量中,我有_id、用户名和密码类型Node.js MongoDB-错误:文档在保存之前必须具有_id,node.js,mongodb,Node.js,Mongodb,我一直在为这个项目苦苦挣扎。我正在学习一个在某些领域已经过时的教程,例如,他们版本的Jquery对某些函数使用了完全不同的格式,我不得不做了很多改变。但我认为我陷入了最后一个似乎无法解决的主要问题。在我的模式变量中,我有_id、用户名和密码类型 var UserSchema = new mongoose.Schema({ _id: mongoose.Schema.ObjectId, username: String, password: String }); 但是,当
var UserSchema = new mongoose.Schema({
_id: mongoose.Schema.ObjectId,
username: String,
password: String
});
但是,当我尝试向我的应用程序添加新用户时,它会弹出[object object],而不会向数据库添加任何内容,而不是获得我应该得到的警报。然后,mongo命令中会弹出此错误
“错误:保存前文档必须具有_id”
我试着注释掉_id行,我得到了正确的消息,但我的数据库中仍然没有显示任何内容。尝试下面我想命名的代码片段_id作为userId,你也可以不用它
var Schema=mongoose.Schema,
ObjectId=Schema.ObjectId;
var UserSchema=新模式({
用户名:String,
密码:String
});
UserSchema.virtual('userId').get(函数(){
返回此。\u id;
});代码>\u id由MongoDb自动添加
如果要在数据结构上保留_id,请确保正确初始化:
var obj = new UserSchema({
"_id": new ObjectID(),
"username": "Bill",
"password" : "...."
});
这很简单:
若您已在模式中显式声明了_id字段,则必须显式初始化它
如果您尚未在模式中声明它,MongoDB将声明并初始化它
您不能做的是将它放在模式中,而不是初始化它。它将抛出您正在谈论的错误无需在模型中指定文档id。如果您省略_id,系统会自动生成id,如下所示:
var UserSchema = new mongoose.Schema({
username: String,
password: String
});
也就是说,如果您仍然希望自己生成_-id,请参见上面的答案。您可以编写没有_-id的模型,这样它将自动生成
或
可以使用.init()初始化数据库中的文档
比如:
然后
const User = require('../models/user');
router.post('/addUser',function(req,res,next){
User.init() // <- document gets generated
const user = new User({
username: req.body.username,
password: req.body.password
})
user.save().then((data)=>{
console.log('save data: ',data)
// what you want to do after saving like res.render
})
}
const User=require('../models/User');
router.post('/addUser',函数(req、res、next){
User.init()//{
console.log('保存数据:',数据)
//像res.render一样保存后要执行的操作
})
}
在我的例子中,我的模式末尾意外地出现了以下内容。删除有效的:
{ _id: false }
我担心如果没有声明Id,那么在查找时文档中将没有Id。但是id是返回的,所以最好不要在模式中声明id。。那样更干净更容易
{ _id: false }