0

这是一个新手问题,因为仍然有一些关于 javascript 的小事情让我感到困惑。

我有以下代码:

db.units.find({}, { _id: 1, type: 1, name: 1 }).sort({ type: 1, name: 1}).exec(function(err, units) {

  if(err) return next(err);

  _.each(units, function(u, i) {
    this[i]["available"] = !_.contains(_.pluck(_.pluck(req.workorder.units, 'unit'), 'name'), u.name);

    console.log(this[i].available);  
    console.log(this[i]);  
    console.log(_.extend(this[i],{available:this[i].available}));
  }, units); 


  return res.render('workorder/show', {
    workorder: req.workorder,
    invoices: db.invoices.find({ workorders: req.params.id }),
    units: units
  });
});

结果如下:

true { _id:513bd​​489b0e7e2634b60dc47,名称:“视觉油底壳检查 UST-22C NC”,类型:“服务”}

它正在记录可用的属性,但不是单独在对象中,这是为什么呢?

4

2 回答 2

1

这个问题与猫鼬如何对待对象有关。只能使用 document.toObject() 修改对象

http://mongoosejs.com/docs/api.html#document_Document-toObject

喜欢:

  _.each(单位,函数(u,i){
    u = _.extend(u.toObject(), {'available': !_.contains(_.pluck(_.pluck(req.workorder.units, 'unit'), 'name'), u.name) });
  });
于 2013-10-02T22:55:48.840 回答
0

我怀疑 Mongoose 正在available以一种使其可读但不可枚举的方式定义该属性。它可以使用getter,也可以enumerable: false使用Object.defineProperty()orObject.defineProperties调用进行设置。

如需快速测试,请尝试将此代码粘贴到 Chrome 控制台或您的 node.js 应用程序中:

var obj = { a: 1 };
Object.defineProperties( obj, {
    b: {
        get: function() {
            return 2;
        }
    },
    c: {
        value: 3,
        enumerable: false
    }
});
console.log( obj );
console.log( obj.a );
console.log( obj.b );
console.log( obj.c );

在 Chrome 中,代码记录:

Object {a: 1}
1
2
3

因此,当显式读取时,所有三个属性都会显示,但在记录整个对象时不会枚举bc

于 2013-10-02T17:38:01.760 回答