Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose查询:删除"_id";属性,保留虚拟属性“;id";结果_Node.js_Mongodb - Fatal编程技术网

Node.js Mongoose查询:删除"_id";属性,保留虚拟属性“;id";结果

Node.js Mongoose查询:删除"_id";属性,保留虚拟属性“;id";结果,node.js,mongodb,Node.js,Mongodb,我正在运行一个Express.js应用程序,我有以下设置: models.js var schemaOptions = { toJSON: { virtuals: true }, toObject: { virtuals: true } }; var modelSchema = new mongoose.Schema({ name : { type: String, required: true } }, schem

我正在运行一个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; });
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});
    });
};
controllers.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; });
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中定义了虚拟属性

如果我将查询select语句更改为:

Model.find().select('-_id name').exec(function(err,model) {}
结果将是:

{"name":"MontyPython", "id":null }
我相信这是因为虚拟属性指向_id属性


我的问题是,如何删除查询中的_id属性,但保留我创建的id别名?

您不能这样做。MongoDB要求
\u id
属性根据显示

您可以选择使用示例中的虚拟属性,也可以在查询结果中隐藏字段


否则,您的mongo驱动程序(如Mongoose)应该能够隐藏或重命名所需的字段或属性。

如果您使用的是Mongoose

您可以处理toJSON,您可以决定它的显示方式,但不能在查询中提及它


Model.find().select('name').exec(函数(err,Model){}


您可以使用全局方法。请尝试以下方法:

mongoose.plugin((schema) => {
  schema.options.toJSON = {
    virtuals: true,
    versionKey: false,
    transform(doc, ret) {
      ret.id = ret._id;
      delete ret._id;
    }
  };
});

这是我在洛达斯的帮助下做到的:)

请注意,只需设置“隐藏”选项,即可隐藏所需的任何字段

customerSchema.set('toObject'{
隐藏:“\u id version passcodeHash”,
转换:(doc,ret,options)=>(ret,options.hide.split(“”)),
})

您可以像这样添加虚拟字段
id
,因为您在代码中找到了它:

modelSchema.virtual('id').get(function () {

    return this._id;
});
然后使用
toJSON
的转换选项删除实际的
\u id

modelSchema.set('toJSON', {
    virtuals: true,
    transform: function(doc, ret) {
        delete ret._id;
    }
});

设置
virtuals:true
将确保您的虚拟字段,即
id
将被序列化。

我认为这是不可能的,因为字段选择工作在数据库级别和虚拟属性工作程序级别。一种解决方法是返回一个新对象,其中包含您需要的字段。这是一种简洁的方法,mongoose模型实际上是存储库,应该始终检索业务模型对象,因此如果您不希望使用_id属性(与底层db技术紧密耦合),odm层必须对其进行转换。我想到一个问题:如何处理单元测试/tdd?我是否应该总是预加载mongoose的实际实例,并在需要时只加载存根模型方法?