在MongooseJS / NodeJS中调用非现有属性

时间:2013-02-07 11:00:46

标签: node.js mongoose

如果我的mongoose架构看起来像这样(例子):

Meta = new Schema
  type_id:Number,
  datahash: String,
  data: Schema.Types.Mixed

这一切都很好。我可以查询 Meta.datahash 并获取值等等。但如果我查询 Meta.OtherProp ,那么我将得到一个错误,因为该属性不存在于模型。

在PHP中,你有魔术方法(getters / setters)可以处理这个问题。

有没有办法在Mongoose(或NodeJS)中执行此操作。例子非常受欢迎:)

BR /淑娜

编辑: 可以说数据是这样的对象:

{
  56:'somevalue',
  77:'Othervalue'
}

现在 - 有什么方法可以直接查询到这个

Meta.data.56

然后返回“somevalue”?

还有一种方法可以避免i查询的js错误

Meta.data.90

因为该物业不存在?

2 个答案:

答案 0 :(得分:1)

我没有使用过Mongoose。但是这里有一些模式可用于在同步和异步情况下设置默认值。

var  DATA={ 56:'somevalue',  77:'Othervalue' };

// SYNC: from JS object
function getPropOrDefault(prop){
  var val = DATA[String(prop)];
  var ret = (val !== undefined ? DATA[String(prop)] : 'default');
  return ret;
};


// ASYNC: from mongoose
function getFromMongoose(key,fn){
//or something. idk how u query mongoose
  process.nextTick(function(){
    var val = DATA[String(key)];
    if(val === undefined) { fn(new Error('no_property')) }
    else{ fn(null, val) };
  });
};

function getMongoosePropOrDefault(prop, callback){
  getFromMongoose(prop, function(err, result){
    if(err){ 
      callback(err, 'default');
    } else {
      callback(null, result);
    };
  });
};


(function main(){
  console.log('DATA[77]: '+getPropOrDefault(77) );
  console.log('DATA[99]: '+getPropOrDefault(99) );
  getMongoosePropOrDefault(77, function(err, result){
    console.log('mongoose.data.77: '+result);
  });
  getMongoosePropOrDefault(99, function(err, result){
    console.log('mongoose.data.99: '+result);
  });
})();

答案 1 :(得分:0)

感谢您的回复。

事实证明,如果我只为Meta.data设置默认值,那么我可以使用方括号[]而不是点符号来查询数据中的非现有属性:

Meta.data[88]

这解决了我的问题,实际上它与js比节点或mongoose更相关。当然,当查询子属性如:

时,这不起作用
Meta.data[88].something

除非确实存在88。但又一次 - 那就是javascript ......