Node.js Mongoose不遵守模式并插入错误的数据类型
我对猫鼬不遵守我定义的模式有一个奇怪的问题。我传递的数据正确地符合指定的模式,但是我遇到了强制转换错误,或者数据(排除无法强制转换的信息时)在mongo中以错误的数据类型结束 模式如下:Node.js Mongoose不遵守模式并插入错误的数据类型,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我对猫鼬不遵守我定义的模式有一个奇怪的问题。我传递的数据正确地符合指定的模式,但是我遇到了强制转换错误,或者数据(排除无法强制转换的信息时)在mongo中以错误的数据类型结束 模式如下: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var AccountSchema = new Schema({ userId: { type: Number, unique: true, dropDups: tru
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var AccountSchema = new Schema({
userId: { type: Number, unique: true, dropDups: true },
referralCode: String,
dateStarted: { type: Date, default: Date.now },
accountType: Number,
accountCategories: [String],
beneficiaries: [{
id: Number,
relationshipType: Number,
percentage: Number,
firstName: String,
lastName: String,
middleInitial: String,
mailingAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
},
ssn: String,
birthDate: Date,
isPrimary: Boolean
}],
accountOwner: {
firstName: String,
lastName: String,
middleInitial: String,
birthDate: Date,
ssn: String,
phoneNumber: String,
mailingAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
},
physicalAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
}
},
fundsTransfer: {
bankName: String,
type: Number,
transferType: Number,
routingNumber: String,
accountNumber: String,
currentYearAmount: Number,
previousYearAmount: Number
},
accountTransfer: {
accountType: Number,
custodianName: String,
accountNumber: String,
phoneNumber: String,
faxNumber: String,
cashAmount: Number,
cashPortionOptions: Number,
expediteOption: Boolean,
otherAccountType: String,
planType: Number
},
wizardFlags: {
doCashContrib: Boolean,
doCashTransfer: Boolean,
doCashContribAndTransfer: Boolean,
doAssetTransfer: Boolean
}
});
var Account = mongoose.model("Account", AccountSchema);
module.exports = Account;
this.mockAccountState = {
userId: 9,
referralCode: "",
dateStarted: Date.now(),
accountOwner: {
firstName: "Test",
lastName: "User",
middleInitial: "X",
birthDate: null,
ssn: "123-45-6789",
phoneNumber: "(123) 456-7890",
mailingAddress: {
address1: "123 A Street",
address2: "",
address3: "",
city: "A City",
state: "CO",
country: "US",
postalCode: "12345"
},
physicalAddress: null
},
accountType: 0,
accountCategories: [],
fundsTransfer: {
bankName: "",
type: 0,
transferType: 1,
routingNumber: "123456789",
accountNumber: "111222333444",
currentYearAmount: 6000,
previousYearAmount: 0
},
assetTransfer: {},
hasBeneficiaries: false,
beneficiaries: [],
wizardFlags: {
doCashContrib: true,
doCashTransfer: false,
doCashContribAndTransfer: false,
doAssetTransfer: false
}
};
传入的数据如下所示:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var AccountSchema = new Schema({
userId: { type: Number, unique: true, dropDups: true },
referralCode: String,
dateStarted: { type: Date, default: Date.now },
accountType: Number,
accountCategories: [String],
beneficiaries: [{
id: Number,
relationshipType: Number,
percentage: Number,
firstName: String,
lastName: String,
middleInitial: String,
mailingAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
},
ssn: String,
birthDate: Date,
isPrimary: Boolean
}],
accountOwner: {
firstName: String,
lastName: String,
middleInitial: String,
birthDate: Date,
ssn: String,
phoneNumber: String,
mailingAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
},
physicalAddress: {
address1: String,
address2: String,
address3: String,
city: String,
state: String,
country: String,
postalCode: String
}
},
fundsTransfer: {
bankName: String,
type: Number,
transferType: Number,
routingNumber: String,
accountNumber: String,
currentYearAmount: Number,
previousYearAmount: Number
},
accountTransfer: {
accountType: Number,
custodianName: String,
accountNumber: String,
phoneNumber: String,
faxNumber: String,
cashAmount: Number,
cashPortionOptions: Number,
expediteOption: Boolean,
otherAccountType: String,
planType: Number
},
wizardFlags: {
doCashContrib: Boolean,
doCashTransfer: Boolean,
doCashContribAndTransfer: Boolean,
doAssetTransfer: Boolean
}
});
var Account = mongoose.model("Account", AccountSchema);
module.exports = Account;
this.mockAccountState = {
userId: 9,
referralCode: "",
dateStarted: Date.now(),
accountOwner: {
firstName: "Test",
lastName: "User",
middleInitial: "X",
birthDate: null,
ssn: "123-45-6789",
phoneNumber: "(123) 456-7890",
mailingAddress: {
address1: "123 A Street",
address2: "",
address3: "",
city: "A City",
state: "CO",
country: "US",
postalCode: "12345"
},
physicalAddress: null
},
accountType: 0,
accountCategories: [],
fundsTransfer: {
bankName: "",
type: 0,
transferType: 1,
routingNumber: "123456789",
accountNumber: "111222333444",
currentYearAmount: 6000,
previousYearAmount: 0
},
assetTransfer: {},
hasBeneficiaries: false,
beneficiaries: [],
wizardFlags: {
doCashContrib: true,
doCashTransfer: false,
doCashContribAndTransfer: false,
doAssetTransfer: false
}
};
如果我为bankName传入一个非空字符串值,则会出现以下错误:
更新帐户时出错:CastError:值转换为数字失败
“测试银行”位于路径“fundsTransfer”
如果排除bankName,则数据库中实际结束的数据如下所示:
如果我使用mongo shell选择此数据,我会得到:
{
"_id" : ObjectId("536ae87342d6347028b42e1e"),
"userId" : 1,
"referralCode" : "",
"accountType" : 1,
"wizardFlags" : {
"doAssetTransfer" : false,
"doCashContribAndTransfer" : false,
"doCashTransfer" : false,
"doCashContrib" : true
},
"accountOwner" : {
"mailingAddress" : {
"postalCode" : "12345",
"country" : "US",
"state" : "CO",
"city" : "A City",
"address3" : "",
"address2" : "",
"address1" : "123 A Street"
},
"physicalAddress" : { },
"phoneNumber" : "(123) 456-7890",
"ssn" : "123-45-6789",
"birthDate" : null,
"middleInitial" : "X",
"lastName" : "User",
"firstName" : "Test"
},
"beneficiaries" : [ ],
"accountCategories" : [ "3" ],
"dateStarted" : ISODate("2014-05-08T02:14:05.379Z"),
"__v" : 0,
"accountTransfer" : { },
"fundsTransfer" : {
"bankName" : null,
"type" : 0,
"transferType" : 1,
"routingNumber" : 123456789,
"accountNumber" : 111222333444,
"currentYearAmount" : 6000,
"previousYearAmount" : 0
}
}
然而,Mongoose实际返回的数据是:
{
"dateStarted":"2014-05-08T02:14:05.379Z",
"accountCategories":["3"],
"beneficiaries":[],
"accountOwner":{
"mailingAddress":{
"address1":"123 A Street",
"address2":"",
"address3":"",
"city":"A City",
"state":"CO",
"country":"US",
"postalCode":"12345"
},
"physicalAddress":{},
"firstName":"Test",
"lastName":"User",
"middleInitial":"X",
"birthDate":null,
"ssn":"123-45-6789",
"phoneNumber":"(123) 456-7890"
},
"accountTransfer":{},
"wizardFlags":{
"doCashContrib":true,
"doCashTransfer":false,
"doCashContribAndTransfer":false,
"doAssetTransfer":false
},
"__v":0,
"accountType":1,
"referralCode":"",
"userId":1,
"_id":"536ae87342d6347028b42e1e"
}
fundsTransfer子对象甚至不存在,尽管它肯定在mongodb中
我很困惑。我不明白为什么模式的其余部分可以工作,但是fundsTransfer对象就是拒绝工作。数据和架构匹配,在某个地方,我退出了
AccountSchema
,您需要更改类型
字段定义:
type: Number,
到
否则,Mongoose认为您将父对象的类型定义为一个编号,而不是在其中定义一个名为“type”的字段。谢谢,Johnny。事实上,我今天一早就发现了这一点。只是其中一个“DOH!!!”的时刻,当我终于明白为什么“路径”是“Fundstrafer”而不是“bankName”时。希望这能得到一些支持,以防其他人遇到类似的问题,因为这是在你经历之前不明显的事情之一。