我正在使用猫鼬(节点),输出id而不是_id的最佳方法是什么?
Answers:
我在执行此操作的模型上创建toClient()方法。这也是重命名/删除您不想发送给客户端的其他属性的好地方:
Schema.method('toClient', function() {
var obj = this.toObject();
//Rename fields
obj.id = obj._id;
delete obj._id;
return obj;
});
假设您使用的是Mongoose,则可以使用“虚拟”,这实际上是Mongoose创建的伪字段。它们没有存储在数据库中,只是在运行时填充:
// Duplicate the ID field.
Schema.virtual('id').get(function(){
return this._id.toHexString();
});
// Ensure virtual fields are serialised.
Schema.set('toJSON', {
virtuals: true
});
每当在您从此模式创建的模型上调用toJSON时,它将包含一个与Mongo生成的_id字段匹配的'id'字段。同样,您可以以相同的方式设置toObject的行为。
看到:
您可以将其抽象为所有模型的BaseSchema,然后进行扩展/调用以将逻辑保持在一个位置。我在创建Ember / Node / Mongoose应用程序时写了以上内容,因为Ember确实更喜欢使用“ id”字段。
Schema.set('toObject', { virtuals: true })
,以便在使用时能够在输出中看到虚拟console.log(obj)
。
toObject
。mongoosejs.com/docs/guide.html#toObject
const companyCollection = mongoose.Schema({});
使用ExpressJs放置在此文件下
id
中,API中包含/预构建了一个虚拟吸气剂。mongoosejs.com/docs/guide.html#id
从Mongoose v4.0开始,此功能的一部分已开箱即用。id
如@Pascal Zajac所述,不再需要手动添加虚拟字段。
Mongoose默认情况下为您的每个模式分配一个id虚拟getter,该属性将文档_id字段强制转换为字符串,对于ObjectIds,则返回其hexString。如果您不希望在架构中添加id getter,则可以在架构构建时通过此选项将其禁用。资源
但是,要将此字段导出为JSON,仍然需要启用虚拟字段的序列化:
Schema.set('toJSON', {
virtuals: true
});
我用这个:
schema.set('toJSON', {
virtuals: true,
versionKey:false,
transform: function (doc, ret) { delete ret._id }
});
我认为如果在virtuals为true时自动抑制_id会很棒。
const UserSchema = new Schema({ stuff }); UserSchema.set("toJSON", { virtuals: true, versionKey: false, transform: function(doc, ret) { delete ret._id; } }); const User = model("user", UserSchema);
lean: true
在从数据库中检索文档时检查您是否没有使用该选项。
这是@ user3087827提供的答案的替代版本。如果发现schema.options.toJSON
未定义,则可以使用:
schema.set('toJSON', {
transform: function (doc, ret, options) {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
}
});
为此,我创建了一个易于使用的插件,将其应用于所有项目以及全球所有架构。它也将转换_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'));
希望这对某人有帮助。
还有normalize-mongoose
一个简单的包,消除_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"
}
还有另一个驱动程序可以将http://alexeypetrushin.github.com/mongo-lite设置convertId
为true。有关更多详细信息,请参见“默认设置”。
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;
}
});
}
}
现在在您的猫鼬模型中,使用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答案的打字稿实现