如何获得唯一的虚拟属性。 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]),然后滚动到主题变换