Mongoose Schema Error: “Cast to string failed for value” when pushing object to empty array

前端 未结 5 1567
清酒与你
清酒与你 2020-12-17 15:32

I have a strange problem and cannot figure out what the problem is. The Error-message doesn\'t help.

I\'m sending an "alarm" to the server and want to save

相关标签:
5条回答
  • 2020-12-17 15:54

    Use inner schema to solve this,

    var SchemaObject = require('node-schema-object');
    
    // Create custom basic type 
    // Type can be extended with more properties when defined 
    var NotEmptyString = {type: String, minLength: 1};
    
    // Create sub-schema for user's Company 
    var Company = new SchemaObject({
      startDate: Date,
      endDate: Date,
      name: NotEmptyString
    });
    
    // Create User schema 
    var User = new SchemaObject({
      // Basic user information using custom type 
      firstName: NotEmptyString,
      lastName: NotEmptyString,
    
      // "NotEmptyString" with only possible values as 'm' or 'f' 
      gender: {type: NotEmptyString, enum: ['m', 'f']},
    
      // Index with sub-schema 
      company: Company,
    
      // An array of Objects with an enforced type 
      workHistory: [Company],
    
      // Create field which reflects other values but can't be directly modified 
      fullName: {type: String, readOnly: true, default: function() {
        return (this.firstName + ' ' + this.lastName).trim();
      }}
    });
    
    // Initialize a new instance of the User with a value 
    var user = new User({firstName: 'Scott', lastName: 'Hovestadt', gender: 'm'});
    
    // Set company name 
    user.company.name = 'My Company';
    
    // The date is automatically typecast from String 
    user.company.startDate = 'June 1, 2010';
    
    // Add company to work history 
    user.workHistory.push({
      name: 'Old Company',
      startDate: '01/12/2005',
      endDate: '01/20/2010'
    });
    
    console.log(user.toObject());
    
    // Prints: 
    { firstName: 'Scott',
      lastName: 'Hovestadt',
      gender: 'm',
      company: 
       { startDate: Tue Jun 01 2010 00:00:00 GMT-0700 (PDT),
         endDate: undefined,
         name: 'My Company' },
      workHistory: 
       [ { startDate: Wed Jan 12 2005 00:00:00 GMT-0800 (PST),
           endDate: Wed Jan 20 2010 00:00:00 GMT-0800 (PST),
           name: 'Old Company' } ],
      fullName: 'Scott Hovestadt' }
    
    0 讨论(0)
  • 2020-12-17 16:00

    I would declare alarm as its own schema and set the alarms property as an array of alarm aka subdocuments. This will allow you to add validation to the alarm schema, etc. NOTE: Subdocuments don't get saved until the parent is saved.

    var alarmSchema = new Schema({
            timestamp : Number,
            dateTime : String, //yyyymmddhhss
            difference : Number,
            actionTaken : String, //"send sms"
    
    });
    
    var deviceSchema = new Schema({
       deviceId: {
            type : String,
            index : {
                unique : true,
                dropDups : true
            }
        },
        alarms : [alarmSchema]
    });
    
    0 讨论(0)
  • 2020-12-17 16:05

    Mongoose interprets the object in the Schema with key 'type' in your schema as type definition for that object.

    deviceId: {
      type : String,
      index : {
        unique : true,
        dropDups : true
        }
    }
    

    So for this schema mongoose interprets deviceId as a String instead of Object and does not care about all other keys inside deviceId.

    SOLUTION:

    Add this option object to schema declaration { typeKey: '$type' }

    var deviceSchema = new Schema(
    {
       deviceId: {
            type : String,
            index : {
                unique : true,
                dropDups : true
            }
        },
        alarms : [ {
            timestamp : Number,
            dateTime : String, //yyyymmddhhss
            difference : Number,
            actionTaken : String, //"send sms"
        } ]
    },
    { typeKey: '$type' }
    );
    

    By adding this we are asking mongoose to use $type for interpreting the type of a key instead of the default keyword type

    Mongoose Docs reference: https://mongoosejs.com/docs/guide.html#typeKey

    0 讨论(0)
  • 2020-12-17 16:05

    Maybe it is too late, but here mongoose is assuming that deviceId is not an object and it is of type String

    deviceId: {
      type : String,
      index : {
        unique : true,
        dropDups : true
      }
    },
    

    SIMPLE SOLUTION:

    deviceId: {
      type: {
        type: String
      },
      index: {
        unique: true,
        dropDups: true
      }
    },
    
    0 讨论(0)
  • 2020-12-17 16:07
    var deviceSchema = new Schema({
     deviceId: {
        type : String,
        index : {
            unique : true,
            dropDups : true
        },
        alarms : {type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Alarm' }]}
    });
    
    var alarmSchema = new Schema({
        timestamp : Number,
        dateTime : String, //yyyymmddhhss
        difference : Number,
        actionTaken : String, //"send sms"
    });
    

    I would recommend to make an own schema for the alarms. I think u cant define an array in a schema like you do.

    0 讨论(0)
提交回复
热议问题