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의 동작도 같은 방법으로 설정할 수 있습니다.
참조:
- http://mongoosejs.com/docs/api.html
- http://mongoosejs.com/docs/guide.html#toJSON
- http://mongoosejs.com/docs/guide.html#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
글로벌하게 설정할 수 있습니다.toJSON
mongoose 오브젝트(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를 합니다.BaseSchema
Schema
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
'programing' 카테고리의 다른 글
TypeScript에서 문자열 유형 배열 테스트 (0) | 2023.02.25 |
---|---|
'Access-Control-Allow-Origin' 헤더는 여러 값 '*, *'을 포함하지만 하나만 허용됩니다. (0) | 2023.02.25 |
Angular 배열에서 항목을 제거하는 방법JS 스코프? (0) | 2023.02.25 |
문자열 중간에 문자 추가 (0) | 2023.02.25 |
$rootScope($rootScope 。$140 대$140입니다.$140 (0) | 2023.02.25 |