Node.js Mongoose不遵守模式并插入错误的数据类型

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

我对猫鼬不遵守我定义的模式有一个奇怪的问题。我传递的数据正确地符合指定的模式,但是我遇到了强制转换错误,或者数据(排除无法强制转换的信息时)在mongo中以错误的数据类型结束

模式如下:

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”时。希望这能得到一些支持,以防其他人遇到类似的问题,因为这是在你经历之前不明显的事情之一。