如何获得唯一的虚拟属性。 Node.JS + Mongoose + MongoDB

考虑我定义了一个Mongoose模式

var Schema_MySchema = new mongoose.Schema({ Field1: String, Field2: String }); 

我通过以下方式添加了虚拟属性和设置选项:

 Schema_MySchema.virtual('USERNAME').get(function () { return this.Field1; }); Schema_MySchema.set('toJSON', { virtuals: true }); 

使用模式对象从MongoDB中检索数据,如下所示:

 var Mod_Obj = mongoose.model('SchemaName', Schema_MySchema); var Model_Instance = new Mod_Obj(); Model_Instance.find({}, function (err, docs) { /* Here I get a object docs with following structure: [{ _id: ObjectId("511XXXdff9c4c419000008"), Field1: 'SOMEvalueFromMongoDB_1', Field2: 'SOMEvalueFromMongoDB_2', USERNAME: 'SOMEvalueFromMongoDB_1' }] */ }); 

现在我想删除从MongoDB返回的实际属性,说我想从docs删除Field1

我尝试了以下方法来删除:

1. delete docs.Field1;

2. var Json_Obj = docs.toJSON(); delete Json_Obj.Field1; var Json_Obj = docs.toJSON(); delete Json_Obj.Field1;

3. var Json_Obj = docs.toObject({ virtuals: true }); delete Json_Obj.Field1; var Json_Obj = docs.toObject({ virtuals: true }); delete Json_Obj.Field1;

4. delete docs[0].Field1;

5. delete docs[0]['Field1'];

所有的方式都不起作用。 🙁

如果执行简单的JSONtesting它的工作:

 var a = { 'A' : 1, 'B': 2 }; delete aA; console.log(a); //prints only object with B attribute only. ie { B: 2 } 

有谁能告诉我这里有什么问题吗?

提前致谢…

因为docs是一个数组,所以我相信你错过了索引。

如果您的文档具有以下结构

 [{ _id: ObjectId("511XXXdff9c4c419000008"), Field1: 'SOMEvalueFromMongoDB_1', Field2: 'SOMEvalueFromMongoDB_2', USERNAME: 'SOMEvalueFromMongoDB_1' }] 

删除代码应该是

 delete docs[index]['Field1'] 

即。 删除第一个元素的Field1

 delete docs[0]['Field1'] 

更新评论:

请参考SO上的这个答案 。

在这里你需要这样做

 var k = docs[index].toObject(); delete k['Field1']; 

您必须在删除字段后保存文档,请尝试以下操作

 var Mod_Obj = mongoose.model('SchemaName', Schema_MySchema); var Model_Instance = new Mod_Obj(); Model_Instance.find({}, function (err, docs) { /* Here I get a object docs with following structure: [{ _id: ObjectId("511XXXdff9c4c419000008"), Field1: 'SOMEvalueFromMongoDB_1', Field2: 'SOMEvalueFromMongoDB_2', USERNAME: 'SOMEvalueFromMongoDB_1' }] */ delete docs[0].Field1; docs[0].save(function(err){ if(err){ console.log(err); }else{ console.log("Field1 is deleted"); } }); }); 

find一些解决scheme 这是与mongoose做的方式

 schema.options.toObject.transform = function (doc, ret, options) { // remove the _id of every document before returning the result delete ret._id; } 

转到Document.toObject([options]),然后滚动到主题变换