Mongoose查询:删除“_id”属性,在结果中保留虚拟属性“id”
我正在运行一个Express.js应用程序,我有以下设置:
models.js
var schemaOptions = { toJSON: { virtuals: true }, toObject: { virtuals: true } }; var modelSchema = new mongoose.Schema({ name : { type: String, required: true } }, schemaOptions); modelSchema.virtual('id').get(function() { return this._id; });
controllers.js
exports.getModel = function(req, res) { Model.find().select('name').exec(function(err,model) { if (err) { return res.status(500).json({errors:err, message: 'Internal server error'}); } return res.status(200).json({model: model}); }); };
上述查询的结果是这样的:
{ "_id":"dakjdjkakda", "name":"MontyPython", "id":"dakjdjkakda" }
因为我在modelSchema中定义了Virtual属性。
如果我将查询select语句更改为:
Model.find().select('-_id name').exec(function(err,model) {}
结果将是:
{"name":"MontyPython", "id":null }
我相信这是因为Virtual属性指向_id属性。
我的问题是,如何删除查询中的_id属性,但保留我创build的id别名?
你不能这样做。 根据文档, MongoDB需要_id
属性。
你的select是使用虚拟属性作为你的例子,也许$项目来隐藏查询结果中的字段。
否则,您的mongo驱动程序(如Mongoose)应该能够隐藏或重命名所需的字段或属性。
如果你正在使用mongoose,
你可以在何时处理JSON,你可以决定它如何显示,但你不能在你的查询中提到它。
Model.find().select('name').exec(function(err,model) {}
new mongoose.Schema(yourSchema, { toJSON: { transform: function(doc, ret) { ret.id = ret._id; delete ret._id; } } );}
你可能会使用全局方法。 试试这个:
mongoose.plugin((schema) => { schema.options.toJSON = { virtuals: true, versionKey: false, transform(doc, ret) { ret.id = ret._id; delete ret._id; } }; });