samidarko samidarko - 2 months ago 15
Node.js Question

Creating a mongoose model containing array types return undefined for those in my docker container

I have a mongoose model containing 2 properties Array of String and some others:

var Model = new Schema({
_id: {type: Number, required: true, unique: true},
name: {type: String, required: true},
oneList: [String],
anotherList: [String]
});


I create the model:

var model = new Model({
_id: 1,
name: 'model',
oneList: ['a', 'b'],
anotherList: ['c', 'd']
})


but when I inspect the model all the list are undefined:

model._doc === {
_id: 1,
name: 'model',
oneList: undefined,
anotherList: undefined
}


I tried some variations:


  • change the model definition from [String] to [ ]

  • create separately the data outside the model then pass it

  • create the model without list data then add it to the model



Even when I create an empty model:

var model = new Model({})
model._doc.oneList === undefined
model._doc.anotherList === undefined


Context:
The problem occurs on a docker container but not on my local machine

node: v4.4.7

mongoose: v4.6.0

GitHub

Answer

I had the same issue, apparently when you have a nested array within your model, mongoose has an open issue 1335 that saves an empty array when a property references a schema. I experimented with presaves to force the property to be an empty array if the property's length is 0 or undefined.

Also be careful when specifying unique=true in the property's schema, as empty or undefined properties will violate the indexing and throw an error.

Note:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var barSchema = new mongoose.Schema({
  baz: String
});

var fooSchema = new mongoose.Schema({
  bars: [barSchema]
});

var Foo = mongoose.model('Foo', fooSchema);

var foo = new Foo();
console.log(foo); // { _id: 55256e20e3c38434687034fb, bars: [] }

foo.save(function(err, foo2) {
  console.log(foo2); // { __v: 0, _id: 55256e20e3c38434687034fb, bars: [] }

  foo2.bars = undefined;
  foo2.save(function(err, foo3) {
    console.log(foo3); // { __v: 0, _id: 55256e20e3c38434687034fb, bars: undefined }

    Foo.findOne({ _id: foo3._id }, function(err, foo4) {
      console.log(foo4); // { _id: 55256e20e3c38434687034fb, __v: 0, bars: [] }

      mongoose.disconnect();
    });
  });
});