1

スキーマ定義でプロパティが定義されていないマングース モデルを更新するためにアンダースコア (_) 拡張を使用できないのはなぜですか。これを回避する方法はありますか?

ノード モデル:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var NodeSchema = new Schema({
    label: {type : String, default : 'none'}
}, { strict: false })

mongoose.model('Node', NodeSchema)

ノード コントローラ:

var node = new Node();
node = _.extend(node, {"EXTENDNOTinSchema":"TRUE"});
console.log("extend: " + node);
node.set("SETNOTinSchema","TRUE");
console.log("set: " + node);

コンソール出力:

extend: { __v: 0,
  _id: 50bb05656880a68976000001,
  label: 'none' }

set: { __v: 0,
  _id: 50bb05656880a68976000001,
  label: 'none' 
  SETNOTinSchema: TRUE}
4

1 に答える 1

7

これは、何かがスキーマにない場合、Mongoose が「defineProperty」を使用できず、割り当てが他のものと同様に扱われるために発生します。

まず、明確にするために。

node = _.extend(node, {"EXTENDNOTinSchema":"TRUE"});

これと同じです:

node['EXTENDNOTinSchema'] = 'TRUE';

これは、一般的なケースでは、これとはまったく異なります。

node.set("SETNOTinSchema","TRUE");

秘訣は、Mongoose がスマートであり、defineProperty前述の関数を使用して、関数をバインドして次のようなことを呼び出すことができるということです。

node['INSCHEMA'] = 'something';

ただし、スキーマにないものについてはこれを行うことができないため、割り当ては通常の割り当てのように機能します。

console.logつまずくのは、隠された魔法を使っているからだと思います。docsを見ると、渡されたオブジェクトconsole.logのメソッドが呼び出されます。inspectMongoose の場合、モデルは属性をモデル オブジェクトに直接保存せず、内部プロパティに保存します。definePropertyまたはで監視されているプロパティに割り当てるとset、内部オブジェクトに値が保存されます。logモデルをinspect作成すると、内部モデルの内容が出力され、モデル値がオブジェクトに保存されているように見えます。

だからあなたがするとき

console.log(node);

あなたが本当に見ているのは

console.log(node.somehiddenproperty);

したがって、あなたの質問に対する答えは、実際には、スキーマにない値がたくさんある場合、_.extend. setとにかくオブジェクトを取るので、代わりに使用してください。

node.set({"EXTENDNOTinSchema":"TRUE"});
于 2012-12-04T03:58:33.377 に答える