Node.js MongoDB-错误:文档在保存之前必须具有_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 }); 但是,当

我一直在为这个项目苦苦挣扎。我正在学习一个在某些领域已经过时的教程,例如,他们版本的Jquery对某些函数使用了完全不同的格式,我不得不做了很多改变。但我认为我陷入了最后一个似乎无法解决的主要问题。在我的模式变量中,我有_id、用户名和密码类型

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 }