programing

MongoDB: '_id'가 아닌 'id' 출력

muds 2023. 2. 25. 22:25
반응형

MongoDB: '_id'가 아닌 'id' 출력

mongoose(노드)를 사용하고 있는데 _id 대신 id를 출력하는 가장 좋은 방법은 무엇입니까?

Mongoose를 사용할 경우 기본적으로 Mongoose가 만드는 가짜 필드인 '가상'을 사용할 수 있습니다.DB에 저장되지 않고 런타임에 채워집니다.

// Duplicate the ID field.
Schema.virtual('id').get(function(){
    return this._id.toHexString();
});

// Ensure virtual fields are serialised.
Schema.set('toJSON', {
    virtuals: true
});

언제든지 J에SON은 이 스키마에서 작성한 모델에서 호출되며, Mongo가 생성하는 _id 필드와 일치하는 'id' 필드가 포함됩니다.마찬가지로 toObject의 동작도 같은 방법으로 설정할 수 있습니다.

참조:

모든 모델을 BaseSchema로 추상화한 후 확장/호출하여 로직을 한 곳에 유지할 수 있습니다.Ember는 'id' 필드를 사용하는 것을 매우 선호하기 때문에 Ember/Node/Mongoose 앱을 만들 때 위와 같이 썼습니다.

Mongoose v4.0에서는 이 기능의 일부가 즉시 지원됩니다.가상 머신을 수동으로 추가할 필요가 없어졌습니다.id@Pascal Zajac이 설명한 필드.

Mongoose는 디폴트로 각 스키마에 id virtual getter를 할당합니다.이것에 의해 documents_id 필드가 string(ObjectId의 경우 hexString)으로 반환됩니다.id getter를 스키마에 추가하지 않으려면 스키마 구축 시 이 옵션을 전달하지 않도록 설정할 수 있습니다.출처

단, 이 필드를 JSON으로 내보내려면 가상 필드의 시리얼화를 활성화해야 합니다.

Schema.set('toJSON', {
    virtuals: true
});

이거 썼어:

schema.set('toJSON', {
  virtuals: true,
  versionKey:false,
  transform: function (doc, ret) {   delete ret._id  }
});

가상이 true일 때 자동으로 _id를 억제하면 좋을 것 같습니다.

이 작업을 수행하는 모델에서 toClient() 메서드를 만듭니다.클라이언트에 송신하지 않는 다른 속성의 이름을 변경하거나 삭제할 수도 있습니다.

Schema.method('toClient', function() {
    var obj = this.toObject();

    //Rename fields
    obj.id = obj._id;
    delete obj._id;

    return obj;
});

다음은 @user3087827에 의해 제공되는 답변의 대체 버전입니다.그걸 찾으면schema.options.toJSON정의되지 않은 경우 다음을 사용할 수 있습니다.

schema.set('toJSON', {
     transform: function (doc, ret, options) {
         ret.id = ret._id;
         delete ret._id;
         delete ret.__v;
     }
}); 
//Transform
Schema.options.toJSON.transform = function (doc, ret, options) {
  // remove the _id of every document before returning the result
  ret.id = ret._id;
  delete ret._id;
  delete ret.__v;
}

반대로 하는 "Schema.options.toObject.transform" 속성이 있거나 가상 ID로 설정할 수 있습니다.

사용하고 싶은 경우id대신_id 글로벌하게 설정할 수 있습니다.toJSONmongoose 오브젝트(v5.3 이후):

mongoose.set('toJSON', {
  virtuals: true,
  transform: (doc, converted) => {
    delete converted._id;
  }
});

메서드 「」를 .toJSON다음 중 하나:

schema.method('toJSON', function () {
   const { __v, _id, ...object } = this.toObject();
   object.id = _id;
   return object;
});

또한 간단한 패키지도 있습니다._id ★★★★★★★★★★★★★★★★★」__v널 위해서.

다음과 같은 것부터:

import mongoose from 'mongoose';
import normalize from 'normalize-mongoose';

const personSchema = mongoose.Schema({ name: String });

personSchema.plugin(normalize);

const Person = mongoose.model('Person', personSchema);
const someone = new Person({ name: 'Abraham' });
const result = someone.toJSON();

console.log(result);

예를 들어 다음과 같은 것이 있습니다.

{
  "_id": "5dff03d3218b91425b9d6fab",
  "name": "Abraham",
  "__v": 0
}

다음의 출력이 표시됩니다.

{
  "id": "5dff03d3218b91425b9d6fab",
  "name": "Abraham"
}

모든 프로젝트와 모든 스키마에 글로벌하게 적용할 수 있도록 사용하기 쉬운 플러그인을 만들었습니다.변환됩니다._id로로 합니다.id 떼는 거예요.__v이치노

즉, 다음과 같이 변환됩니다.

{
  "_id": "400e8324a71d4410b9dc3980b5f8cdea",
  "__v": 2,
  "name": "Item A"
}

보다 심플하고 깔끔하게:

{
  "id": "400e8324a71d4410b9dc3980b5f8cdea",
  "name": "Item A"
}

글로벌 플러그인으로 사용:

const mongoose = require('mongoose');
mongoose.plugin(require('meanie-mongoose-to-json'));

또는 특정 스키마의 경우:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MySchema = new Schema({});
MySchema.plugin(require('meanie-mongoose-to-json'));

이게 도움이 됐으면 좋겠네요.

반환할 항목을 검색할 때 집계 기능을 사용할 수도 있습니다.$project에서는 필드를 생성하여 _id에 할당할 수 있습니다.

<model>.aggregate([{$project: {_id: 0, id: '$_id'}], (err, res) => {
 // 
})

Lodash를 사용하여 원하는 요소를 선택할 경우 이 방법이 도움이 됩니다.

UserSchema.virtual('id').get(function(){
  return this._id.toHexString();
});

UserSchema.set('toObject', { virtuals: true })

UserSchema.methods.toJSON = function() {
  return _.pick( 
    this.toObject(), 
    ['id','email','firstName','lastName','username']
  );

「」를 .toJSON특정 모델 스키마에 대한 메서드.https://mongoosejs.com/docs/api.html#schema_Schema-method

YourSchema.methods.toJSON = function () {
  return {
    id: this._id,
    some_field: this.some_field,
    created_at: this.createdAt
  }
}

기본 스키마를 만듭니다.

import { Schema } from "mongoose";

    export class BaseSchema extends Schema {
        constructor(sche: any) {
            super(sche);
            this.set('toJSON', {
        virtuals: true,
        transform: (doc, converted) => {
            delete converted._id;
        }
    });
        }
    
    }

에서는 mongoose를 합니다.BaseSchemaSchema

import mongoose, { Document} from 'mongoose';
import { BaseSchema } from '../../helpers/mongoose';

const UserSchema = new BaseSchema({
    name: String,
    age: Number,

});

export interface IUser {
    name: String,
    age: Number,

}

interface IPlanModel extends IUser, Document { }

export const PlanDoc = mongoose.model<IPlanModel>('User', UserSchema);

@Pascal Zajac answer의 타이프 스크립트 구현

http://alexeypetrushin.github.com/mongo-lite 를 설정하는 다른 드라이버가 있습니다.convertId사실자세한 내용은 "기본값 및 설정" 섹션을 참조하십시오.

Mongoose는 기본적으로 각 스키마에 id virtual getter를 할당합니다.이것에 의해 문서의 _id 필드 캐스트가 문자열로 반환됩니다.ObjectId의 경우는 hexString입니다.

https://mongoosejs.com/docs/guide.html

사전 '저장' 후크를 사용할 수도 있습니다.

TouSchema.pre('save', function () {      
  if (this.isNew) {
    this._doc.id = this._id;      
  } 
}
JSON.parse(JSON.stringify(doc.toJSON()))

언급URL : https://stackoverflow.com/questions/7034848/mongodb-output-id-instead-of-id

반응형