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; } }; });