我正在使用mongoose(节点),输出id而不是_id的最佳方法是什么?
鉴于你使用的是Mongoose,你可以使用'virtuals',它们基本上是Mongoose创建的假字段.它们不存储在数据库中,它们只是在运行时填充:
// Duplicate the ID field. Schema.virtual('id').get(function(){ return this._id.toHexString(); }); // Ensure virtual fields are serialised. Schema.set('toJSON', { virtuals: true });
任何时候在你从这个Schema创建的模型上调用toJSON,它将包含一个'id'字段,它匹配Mongo生成的_id字段.同样,您可以以相同的方式设置toObject的行为.
看到:
http://mongoosejs.com/docs/api.html
http://mongoosejs.com/docs/guide.html#toJSON
http://mongoosejs.com/docs/guide.html#toObject
您可以将其抽象为BaseSchema,然后扩展/调用所有模型以将逻辑保存在一个位置.我在创建Ember/Node/Mongoose应用程序时编写了上述内容,因为Ember真的更喜欢使用"id"字段.
我在我的模型上创建了一个toClient()方法.它也是重命名/删除您不想发送给客户端的其他属性的好地方:
Schema.method('toClient', function() { var obj = this.toObject(); //Rename fields obj.id = obj._id; delete obj._id; return obj; });
从Mongoose v4.0开始,该功能的一部分支持开箱即用.id
如@Pascal Zajac所解释的那样,不再需要手动添加虚拟字段.
Mongoose默认情况下为每个模式分配一个id虚拟getter,它返回文件_id字段强制转换为字符串,或者对于ObjectIds,返回其hexString.如果您不希望将ID getter添加到架构中,则可以在架构构建时禁用它以传递此选项.资源
但是,要将此字段导出为JSON,仍需要启用虚拟字段的序列化:
Schema.set('toJSON', { virtuals: true });
//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.
以下是@ user3087827提供的答案的替代版本.如果您发现schema.options.toJSON
未定义,那么您可以使用:
schema.set('toJSON', { transform: function (doc, ret, options) { ret.id = ret._id; delete ret._id; delete ret.__v; } });
我用过这个:
schema.set('toJSON', { virtuals: true, versionKey:false, transform: function (doc, ret) { delete ret._id } });
我认为如果它们在virtuals为true时自动抑制_id会很棒.
为此,我创建了一个易于使用的插件,将其应用于所有项目以及全球所有架构。它将转换_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'));
希望这对某人有帮助。