source

MongoDB - 오류: 저장하기 전에 문서에 _id가 있어야 합니다.

manysource 2023. 6. 29. 20:12

MongoDB - 오류: 저장하기 전에 문서에 _id가 있어야 합니다.

저는 이 프로젝트 때문에 너무 고생했어요.저는 일부 영역에서 구식인 튜토리얼을 따르고 있습니다. 예를 들어, Jquery 버전은 일부 기능에 대해 완전히 다른 형식을 사용했으며 많은 변경 작업을 수행해야 했습니다.하지만 저는 해결책을 찾을 수 없을 것 같은 마지막 주요 문제에 도달했다고 생각합니다.스키마 변수에 _id, 사용자 이름 및 암호 유형이 있습니다.

var UserSchema = new mongoose.Schema({
    _id: mongoose.Schema.ObjectId,
    username: String,
    password: String
}); 

그러나 앱에 새 사용자를 추가하려고 하면 알림을 받는 대신 [Object Object](개체 개체)로 팝업되고 데이터베이스에는 아무것도 추가되지 않습니다.그러면 이 오류가 mongo cmd에 나타납니다.

"오류: 저장하기 전에 문서에 _id가 있어야 합니다."

_id 행을 주석 처리하려고 시도했지만 올바른 메시지가 표시되지만 데이터베이스에는 여전히 아무것도 표시되지 않습니다.

아주 간단합니다.

  1. 스키마에서 _id 필드를 명시적으로 선언한 경우 명시적으로 초기화해야 합니다.
  2. 스키마에서 선언하지 않은 경우 MongoDB가 선언하고 초기화합니다.

할 수 없는 것은 스키마에 있지만 초기화하지 않는 것입니다.그것은 당신이 말하는 오류를 던질 것입니다.

몽구스(@nestjs/mongoose) 용액을 사용한 NestJS

저는 오류를 수정했습니다.

  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);

_id 없이 모델을 작성할 수 있으므로 자동 생성됩니다.

또는

.init()를 사용하여 DB의 문서를 초기화할 수 있습니다.

예:

const mongoose = require('mongoose');

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

module.exports = mongoose.model('User', UserSchema);

그리고 나서.

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
  })
}

몽구스를 사용하는 경우nest js그리고.GraphQL나는 그것을 변경하여 고쳤습니다.id로._id그리고 제거.@prop그 위에는 심지어 null 값도 있습니다.id문제가 사라졌습니다.github의 예

import { ObjectType, Field, Int, ID } from '@nestjs/graphql';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
import { User } from 'src/user/entities/user.entity';
import * as mongoose from 'mongoose';

export type SchoolDocument = School & Document;
@ObjectType()
@Schema()
export class School {
  @Prop()//remove this
  @Field(() => ID,{ nullable: true })
  _id: string;
  @Prop()
  @Field(() => String,{ nullable: true })
  name: string;
  @Field(()=>[User],{nullable:true})
  users:User[];
}
export const SchoolSchema= SchemaFactory.createForClass(School);

내가 _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;
});

_id는 MongoDb에 의해 자동으로 추가됩니다.

_id를 데이터 구조에 유지하려면 올바르게 초기화해야 합니다.

import { Types } from "mongoose";

const obj = new UserSchema({ 
  "_id": new Types.ObjectId(), 
  "username": "Bill", 
  "password" : "...." 
});

저의 경우, 스키마 끝에 다음과 같은 내용이 실수로 있었습니다.작동한 항목 제거:

{ _id: false }

제가 수정한 방법을 보세요. _id가 아닌 json 게시물 요청에 id를 넣었습니다.

모델에 document_id를 지정할 필요가 없습니다._id를 생략하면 다음과 같이 id가 자동으로 생성됩니다.

var UserSchema = new mongoose.Schema({    
    username: String,
    password: String
}); 

즉, 여전히 _id를 직접 생성하고 싶다면 위의 답변을 참조하십시오.

언급URL : https://stackoverflow.com/questions/45952928/mongodb-error-document-must-have-an-id-before-saving