1

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'
      }]
  */
});

Field1今、MongoDB から返された実際の属性を削除したいと思います。docs

以下の削除方法を試しました。

1. delete docs.Field1;

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

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

4. delete docs[0].Field1;

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

すべての方法が機能しませんでした。:-(

単純な JSON でテストするために実行すると、次のように機能しました。

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

ここで何が悪いのか誰か教えてもらえますか?

前もって感謝します...

4

4 に答える 4

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'];
于 2013-02-08T07:53:29.010 に答える
1

フィールドが削除された後、ドキュメントを保存する必要があります。次のようにしてみてください

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");
}
});
});
于 2013-02-08T08:38:14.667 に答える
1

いくつかの解決策を見つけました。これがマングースでそれを行う方法です

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

Document.toObject([options])に移動し、トピックTransformまでスクロールします

于 2013-02-08T09:34:35.373 に答える
0

それを返すには、モデルを更新する必要があります。

toJSON: {
    virtuals: true,
    transform: function(doc, ret) {
         ret.id = ret._id;
         delete ret._id;
      }
}
于 2021-04-15T04:27:53.617 に答える