5

一時的なマングースモデルに関する情報があります。パフォーマンス上の理由から、モデルに対して保存したくありません。ただし、サーバーに接続して要求するクライアントにこの情報を提供できるようにしたいと思います。

簡単な例を次に示します。

 var mongoose = require('mongoose'),
     db = require('./dbconn').dbconn;

 var PersonSchema = new mongoose.Schema({
  name    : String,
  age     : Number,
});

var Person = db.model('Person', PersonSchema);
var fred = new Person({ name: 'fred', age: 100 });

Personスキーマには、保存したい2つの属性(名前と年齢)があります。これは機能します。コンソールに表示されます。

console.log(fred);

{名前:'フレッド'、年齢:100、_id:509edc9d8aafee8672000001}

ただし、急速に変化する属性( "status")が1つあり、これをデータベースに保存したくありません。しかし、動的に追跡してクライアントに提供したいので、キーとしてインスタンスに追加します/ valペア。

fred.status = "alive";

「生きている」キー/値のペアを追加した後、コンソールでfredをもう一度見ると、 fredが再び表示されますが、彼のステータスは表示されません。

{名前:'フレッド'、年齢:100、_id:509edc9d8aafee8672000001}

それでも、キーと値のペアは間違いなくそこにあります。

console.log(fred.status);

レンダリング:

生きている

クライアントに送信しているオブジェクトのJSON表現についても同じことが言えます。「ステータス」は含まれていません。

理由がわかりません..誰か助けてもらえますか?

または、代わりに、データベースに永続化されていないマングーススキーマに属性を追加するためのより良いアプローチはありますか?

4

3 に答える 3

9

スキーマに以下を追加すると、必要な処理が実行されます。

PersonSchema.virtual('status').get(function() {
  return this._status;
});

PersonSchema.virtual('status').set(function(status) {
  return this._status = status;
});

PersonSchema.set('toObject', {
  getters: true
});

これにより、仮想属性が追加されます。これは仮想statusであるため、永続化されません。最後の部分は、コンソールログを正しく出力するために必要です。ドキュメントから:

すべての仮想をconsole.log出力に表示するには、toObjectオプションを{getters:true}に設定します。

statusまた、 (ここでは)以外の内部プロパティ名を使用する必要があることに注意してください_status。同じ名前を使用すると、getを実行するときに無限再帰ループに入ります。

于 2012-11-11T03:26:54.240 に答える
2

.toObject()データオブジェクトを呼び出すだけです。

あなたのコードは次のようになります:

fred.toObject()

于 2013-01-18T10:09:41.130 に答える
0

これは非常に役に立ちました。私はこれに自分で苦労しなければなりませんでした。私の場合、マングースから文書を入手していました。新しいキーを追加したときに、console.logを実行すると、そのキーはオブジェクトに表示されませんでした。キー(console.log(data.status))を検索すると、ログに表示されましたが、オブジェクト全体をログに記録した場合は表示されませんでした。

この応答スレッドを読んだ後、それは機能しました。

たとえば、MongoDB呼び出しから次のようなオブジェクトを取得しました。

`Model.find({}).then(result=> {
    //console.log(result);// [{ name:'John Doe', email:'john@john.com'}];

    //To add another key to the result, I had to change that result like this:
    var d = result[0];
    var newData = d.toJSON();
    newData["status"] = "alive";
    console.log(newData);// { name:'John Doe', email:'john@john.com', status:'alive'};
}).catch(err=>console.log(err))`

これが他の誰かに役立つことを願っています。HappyCoding

于 2019-01-27T18:35:16.107 に答える