1

好的,所以我有这个 SchemaOptions、Schema、Constructor 和 virtual。

var schemaOptions = {
  toObject: { virtuals: true }, toJSON: { virtuals: true }
};

var clientSchema = mongoose.Schema ({
  company: { type: String, trim: true, required: true, unique: true  },
  monthly_cost: { type: Number, trim: true, required: true },
  sms_cost: { type: Number, trim: true, required: true },
  ...
}, schemaOptions);

var Client = mongoose.model('Client', clientSchema);

clientSchema.virtual('creationDate').get(function () {
  return dateFormat(this._id.getTimestamp(), 'isoDate');
});

再往下我有这条路线:(注意for循环中的注释代码,稍后我们将删除此注释)

app.get('/superadmin', function(req, res) {
  Client.find({}, 'company monthly_cost sms_cost', function (err, docs) {
    if (err) return handleError(err);

    for (var i = 0, tot=docs.length; i < tot; i++) {
      // docs[i].creationDate = 'strange variable ' + i; 
    }

    console.log(docs); 

    res.render('superadmin/index', { 
      title: 'Superadmin',
      docs: docs,
      path: req.route.path,
    });
  });
});

在我的 Jade 视图中,我有以下代码:

p #{docs};
each client in docs
  tr
    td #{client.company}
    td #{client.creationDate}
...

但是问题来了:

在我的路线中,我有:console.log(docs);它输出一个类似于'YYYY-MM-DD'的字符串,这是预期的并且很好。

在我看来,我早期有:console.log(docs);它还输出正确的字符串:'YYYY-MM-DD',这是预期的和好的。

但是:在我看来,#{client.creationDate} 并没有输出任何东西!!我不明白为什么。

如果我们现在像这样激活我的 for 循环中的注释行:

for (var i = 0, tot=docs.length; i < tot; i++) {
  docs[i].creationDate = 'strange variable ' + i; 
}

...#{client.creationDate}将输出'strange variable [0-2]'。但是我之前的两个console.log(docs)仍然会输出预期的 creationDate 字符串。

我不明白这一点..似乎creationDate同时是两个变量。

Mongoose Virtuals 快把我逼疯了,我真的不明白为什么我要向他们抱怨,因为它似乎可以动态地将键值添加到获取的 mongoose 对象。好的,它们不会出现在 console.log 中......但它们以某种方式存在,我可以像这样使用它们:#{client.creationDate}在我看来。

4

1 回答 1

2

此代码无序:

var Client = mongoose.model('Client', clientSchema);

clientSchema.virtual('creationDate').get(function () {
  return dateFormat(this._id.getTimestamp(), 'isoDate');
});

在将模式“编译”为模型之前,您必须完全配置模式。它不是动态的。编译模型后,对架构的进一步更改不会生效。

于 2013-09-17T21:14:27.497 回答