MongoDB - 오류: 저장하기 전에 문서에 _id가 있어야 합니다.
저는 이 프로젝트 때문에 너무 고생했어요.저는 일부 영역에서 구식인 튜토리얼을 따르고 있습니다. 예를 들어, Jquery 버전은 일부 기능에 대해 완전히 다른 형식을 사용했으며 많은 변경 작업을 수행해야 했습니다.하지만 저는 해결책을 찾을 수 없을 것 같은 마지막 주요 문제에 도달했다고 생각합니다.스키마 변수에 _id, 사용자 이름 및 암호 유형이 있습니다.
var UserSchema = new mongoose.Schema({
_id: mongoose.Schema.ObjectId,
username: String,
password: String
});
그러나 앱에 새 사용자를 추가하려고 하면 알림을 받는 대신 [Object Object](개체 개체)로 팝업되고 데이터베이스에는 아무것도 추가되지 않습니다.그러면 이 오류가 mongo cmd에 나타납니다.
"오류: 저장하기 전에 문서에 _id가 있어야 합니다."
_id 행을 주석 처리하려고 시도했지만 올바른 메시지가 표시되지만 데이터베이스에는 여전히 아무것도 표시되지 않습니다.
아주 간단합니다.
- 스키마에서 _id 필드를 명시적으로 선언한 경우 명시적으로 초기화해야 합니다.
- 스키마에서 선언하지 않은 경우 MongoDB가 선언하고 초기화합니다.
할 수 없는 것은 스키마에 있지만 초기화하지 않는 것입니다.그것은 당신이 말하는 오류를 던질 것입니다.
몽구스(@nestjs/mongoose) 용액을 사용한 NestJS
저는 오류를 수정했습니다.
- 제거 중
@Prop()
위에_id
- 더하다
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
'source' 카테고리의 다른 글
Oracle: 날짜 시간에서 밀리초 차감 (0) | 2023.06.29 |
---|---|
SSMS 내에서 .SQL 파일 집합을 실행하려면 어떻게 해야 합니까? (0) | 2023.06.29 |
MATLAB 코드를 Python으로 변환하는 도구 (0) | 2023.06.29 |
python XlsxWriter 여러 셀 주위에 테두리 설정 (0) | 2023.06.29 |
Java에서 Excel의 부동 소수점 일치 (0) | 2023.06.24 |