我刚刚遇到了意想不到的猫鼬行为,并希望与那些熟悉猫鼬的人确认。
我理解mongoose guide on schemas表示只要您引用架构的属性,它就会自动转换为指定的数据类型。本指南中使用的语言相当笼统,可能含糊不清:
我们的代码blogSchema中的每个键都在我们的文档中定义了一个属性 将被转换为其关联的SchemaType。例如,我们已经 定义了一个将转换为String SchemaType的属性标题 和属性日期将被转换为Date SchemaType。
从我最近的发现来看,它看起来并不像我想象的那样普遍。
我有transaction
的架构,其中包含amount
,如下所示:
let transactionSchema = mongoose.Schema({
...
amount: { type: Number, required: true },
description: { type: String, required: true },
从我的客户端,我的HTML将输入提交给路由器,并分配req.body参数,如下所示:
router.post('/save', function(req, res) {
let theTransaction = {
_id: req.body.transactionId,
...
amount: req.body.amount,
description: req.body.description,
据我了解这个过程,HTML正在将一个字符串发送回路由器,因此req.body.amount
实际上是一个字符串。我允许mongoose保存它,并且保存的版本没有问题。
然而,让我们说theTransaction.amount
= 500.当我提到我保存的theTransaction
对象时,我看到555 + theTransaction.amount = 555500.00,而不是1055。
这是我的测试:
console.log("transaction.amount"); \\transaction.amount
console.log(transaction.amount); \\500.00
console.log(typeof transaction.amount); \\string
let nmbr = 555;
nmbr += transaction.amount;
console.log("nmbr"); \\nmbr
console.log(nmbr); \\555500.00
console.log(typeof nmbr); \\string
我很惊讶地看到这一点。我假设mongoose会在其内置的getter中为模式执行一次转换。我开始寻找并发现你可以create your own getters in a mongoose schema。
我可以理解像mongoose文档示例中所示的特殊用途getter的目的。但是,我不明白为什么mongoose会被设计为要求我为我创建的每种基本类型创建一个getter。
我是否误用了猫鼬,或者我是否需要在我的模式中添加大量的getter?或者我还有其他方法可以解决这个问题吗?
感谢。
答案 0 :(得分:0)
很难判断您是否正确创建文档而未查看其中的代码,因此我无法直接帮助您解决问题。但是我可以验证在Mongoose中铸造是否完美。
const assert = require('assert');
const mongoose = require('mongoose');
const toySchema = new mongoose.Schema({
name: { type: String },
cost: { type: Number }
});
const Toy = mongoose.model('Toy', toySchema);
const toy = new Toy({
name: 'Blaster',
cost: '10.00'
});
assert.equal(typeof toy.cost, 'number'); // Passes
assert.strictEqual(toy.cost, 10.00); // Passes