MongoDB - 错误:文档在保存之前必须有_id

Mat*_*Lee 12 passwords username mongodb node.js

我一直在为这个项目苦苦挣扎.我正在遵循一些在某些领域过时的教程,例如他们的Jquery版本对某些函数使用了完全不同的格式,我不得不做很多改变.但我认为我已经陷入了最后一个无法找到解决方案的重大问题.在我的Schema变量中,我有_id,用户名和密码类型

var UserSchema = new mongoose.Schema({
    _id: mongoose.Schema.ObjectId,
    username: String,
    password: String
}); 
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将新用户添加到我的应用程序时,它不会获得我应该获得的警报,而是弹出为[object Object]并且没有任何内容添加到数据库中.然后在mongo cmd中弹出此错误

"错误:文档在保存之前必须有_id".

我已经尝试评论_id行,我得到了正确的消息,但我的数据库中仍然没有显示任何内容.

das*_*dsa 28

它非常简单:

  1. 如果已在架构中显式声明_id字段,则必须显式初始化它
  2. 如果您尚未在架构中声明它,MongoDB将声明并初始化它.

你不能做的是将它放在架构中但不初始化它.它会抛出你正在谈论的错误


Niv*_*han 22

NestJS 与 mongoose (@nestjs/mongoose) 解决方案

我通过以下方式修复了错误

  1. 删除@Prop()上面_id
  2. 添加mongoose.Types.ObjectId为类型_id
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import mongoose from 'mongoose';
import { Document } from 'mongoose';

export type CompanyDocument = Company & Document;

@Schema()
export class Company {
  _id: mongoose.Types.ObjectId;

  @Prop({ unique: true })
  name: string;
}

export const CompanySchema = SchemaFactory.createForClass(Company);

Run Code Online (Sandbox Code Playgroud)

  • 哇,这真的很有效。我猜他们没有反映它,但类型是推断出来的? (2认同)

小智 5

您可以在没有 _id 的情况下编写模型,以便自动生成

或者

您可以使用 .init() 来初始化数据库中的文档。

喜欢:

const mongoose = require('mongoose');

const UserSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  username: String,
  password: String
})

module.exports = mongoose.model('User', UserSchema);
Run Code Online (Sandbox Code Playgroud)

进而

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
  })
}
Run Code Online (Sandbox Code Playgroud)


小智 2

尝试下面的代码片段,我想将 _id 命名为 userId,您也可以不使用它。

var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var UserSchema = new Schema({
    username: String,
    password: String
});
UserSchema.virtual('userId').get(function(){
    return this._id;
});
Run Code Online (Sandbox Code Playgroud)