Mongoose: рдЬрдм рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рдХрд┐рд╕реА рд╕реНрдХреАрдорд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреА рд╣реИ рддреЛ рдЦрд╛рд▓реА рд╕рд░рдгреА рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдлрд╝рд░ре░ 2013  ┬╖  39рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

var FooSchema = new Schema({});
var Foo = mongoose.model("Foo", FooSchema);
var BarSchema = new Schema({
    foos: [Foo.schema]
});
var Bar = mongoose.model("Bar", BarSchema);

var b = new Bar();
b.save();

рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп b.foos рдХреА рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдмрдирд╛рдПрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@antonioaltamura рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛, рдиреАрдЪреЗ рдиреЗрд╡рд▓рд╛ 4.6 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const CollectionSchema = new Schema({
 field1: { type: [String], default: void 0 }, // <-- override the array default to be undefined
});

const Collection = mongoose.model('test', CollectionSchema);

Collection.create({}).
  then(doc => { console.log(doc); return doc; }).
  then(() => { process.exit(0); });

рд╕рднреА 39 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдиреЗрд╡рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреГрд╢реНрдп рдЧреИрд░-рдиреЗрд╡рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреГрд╢реНрдп рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реВрдиреНрдп рдХреИрд╕реЗ рдмрдирд╛рдКрдВ? ;-) рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореЛрдВрдЧреЛ рдореЗрдВ рдЙрди рд╕рднреА рдмрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЦрд╛рд▓реА рдлреВ рд╣реИрдВред рдореБрдЭреЗ рдЙрд╕ рд░рд╛рдЬреНрдп рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдиреА рд╣реИ, рдЬреЛ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред

рдЕрдЪреНрдЫрд╛ рдРрд╕рд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдирдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЦрд╛рд▓реА рдлрд╝реВрдЬрд╝ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛:

BarSchema.pre('save', function (next) {
  if (this.isNew && 0 === this.foos.length) {
    this.foos = undefined;                                                                                                                                   
  }
  next();
})

рдорд┐рдард╛рдИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдордХрд╛рдЬ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? (рдиреЗрд╡рд▓рд╛ 3.8.3 рдпрд╣рд╛рдБ)

Mathieumg: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ (3.8.15)

рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдХреБрдЫ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред (рдпрд╣ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди
рдореБрдЭреЗ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ :))

рд╕реЛрдо, рдЕрдЧрд╕реНрдд реирел, реирежрезрек рдЕрдкрд░рд╛рд╣реНрди рек:рекреп рдмрдЬреЗ, рдореИрдереНрдпреВ рдПрдо-рдЧреЛрд╕рд▓рд┐рди <
рд╕реВрдЪрдирд╛рдПрдВ@github.com> рдиреЗ рд▓рд┐рдЦрд╛:

рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/LearnBoost/mongoose/issues/1335#issuecomment -53328195
.

+1
рдкреВрд░реНрд╡ рдХрд╛рд░реНрдп 3.8.15 . рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдХреНрд╡реЗрд░реА рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдпрд╛ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИред

        this.foos = null;

@ gaurang171 @Nepoxx рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдХреБрдЫ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ )

4.0.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдЕрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

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();
    });
  });
});

@viking рдпрд╣ рдХрднреА 'рддрдп' рдирд╣реАрдВ рдерд╛ред рдПрдХ рдЙрдкрд╛рдп рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред =)

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЖрдкрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ @ vkarpov15 рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рдЦреЛрд▓рд╛ рдЧрдпрд╛, рдЬреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж 4.x рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддрдп рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рд╣рд╛рдБ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рдореБрдЭреЗ рдореМрдХрд╛ рдорд┐рд▓рд╛ рддреЛ рдореИрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдпрд╣ рд╕рдордЭрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдиреЗрд╡рд▓реЗ рдЬреАрдердм рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдерд╛ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрдиреЗ рдкрд░, рд╣рдо рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реЗрд╡рд░ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рдПрдХ рдЯреНрд╡рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдЖрдк рдПрдХ рдЦрд╛рд▓реА рдРрд░реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рдирд╣реАрдВред

рддреЛ рдореЗрд░рд╛ рдкреНрд░реАрд╕реЗрд╡ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

        var schema = mongoose.Schema({
                   ...
           "children": [ String ]
                   ...
            });
        // turn off the saving of empty children if there are no children in the schema.
        schema.pre('save', function (next) {
            if (this.isNew) {
                if (this.children.length == 0) {
                    this.children = undefined;       
                }
                else if (this.children.length == 1 && this.children[0] == null) {
                    this.children = [];
                }                                                                                                                    
            }
            next();
        });
        var model = mongoose.model('MyDocument', schema);

рдФрд░ рдлрд┐рд░ рдЦрд╛рд▓реА рдмрдЪреНрдЪреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ:

idea.children = [null];

рдЬрдмрдХрд┐ рдпрд╣ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

idea.children = [];

рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред

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

var quxSchema = new mongoose.Schema({ qux: String });
var fooSchema = new mongoose.Schema({ foo: { bar: { baz: [ quxSchema ] } } });
var Foo = mongoose.model('Foo', fooSchema);

var foo = new Foo({foo: undefined})
foo.save(function(err, foo) {
  console.log(JSON.stringify(foo)); // {"__v":0,"_id":"557ae56480f047fd4ff4ab26","foo":{"bar":{"baz":[]}}}
  Foo.find({ _id: foo._id }, function(err, foos) {
    console.log(JSON.stringify(foos[0])); // {"_id":"557ae56480f047fd4ff4ab26","__v":0,"foo":{"bar":{"baz":[]}}}
  });
});

рдпрд╣рд╛рдВ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ foo рдЧрд╛рдпрдм рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдкреНрд░реА рд╕реЗрд╡ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛? {foo: undefined} рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ foo рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╢рдХреНрдд foo рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ foo рдХреЛ рдкреНрд░реАрд╕реЗрд╡ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрджрд╕реВрд░рддред

рдореИрдВ рдмрд╕ рдЙрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдЬреИрд╕реЗ @viking рдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛?

рдореИрдВрдиреЗ рдЗрд╕реЗ 'рдкреНрд░реА' рд╕реЗрд╡ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА .. рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрднреА-рдХрднреА рд╣реЛрддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рддрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рд╕реЗ рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ JSON рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдПрдХ рд╕рд░рдгреАред рдпрд╣ рдореЗрд░реЗ рдЬреЗрд╕рди рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрд╛рддрдХ рдЕрдкрд╡рд╛рдж рд╣реИ рдЬреЛ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

var subA = mongoose.Schema({
     name: String,
     a: String
});

var subB = mongoose.Schema({
     name: String,
     b: String
});

var A = mongoose.Schema({
name: String,
filter: {
        lastupdate  : { type: Date, default: Date.now },
        subA: [{type: Schema.Types.ObjectId, ref: 'subA', unique: true}],
        subB: [{type: Schema.Types.ObjectId, ref: 'subB', unique: true}]
    }
});

var ModelA = mongoose.model('A', A);

var obj = new modelA();
obj.save();

... рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

{
 filter: []
}

рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛ рддреЛ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд╕реНрддреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЦрд╛рд▓реА рд╕рд░рдгреА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

{
 filter: {} 
}

рдХрд┐рд╕реА рдХреЛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рд╕рд╛рджрд░

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░реАрд╕реЗрд╡ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрдЪреНрдЪреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ" рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрд╛рд▓реА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рддреЛ рдЖрдкрдХрд╛ рдмрдЪрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

if (this.isNew) {
    if (typeof(this.filter.empty) != "undefined") {
        this.filter = {};
    }
}

рдлрд┐рд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрд╛рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

var obj = new modelA();
obj.filter = { empty: true };
obj.save();

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╕реНрдХреАрдорд╛ рдореЗрдВ "рдЦрд╛рд▓реА" рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рдХрднреА рднреА рдиреЗрд╡рд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ .. рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рдЖрдкрдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЦрд╛ рдФрд░ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ :)

рд╕рд╛рджрд░
рд╕рд╛рдЗрдорди

рд╡реИрдХрд▓реНрдкрд┐рдХ Array рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреАрдорд╛ рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖ рд░рд╣реА рдереАрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

optional_array = 
  type: Mixed
  validate: 
    validator: (v) ->
      return v instanceof Array
    message: '{VALUE} needs to be an array.'

рдФрд░ рдлрд┐рд░ рдореЗрд░реЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ optional_array рдмрдЬрд╛рдп Array ред

@simllll рдореИрдВ рд▓рд╛рдкрддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП null рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ null рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдбрд┐рдЬрд╛рдЗрди рд╣реИред рдЖрдкрдХреЛ рдореЗрд░реА рдУрд░ рд╕реЗ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд╣реЛ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реЗрдЯ рди рд╣реЛред рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

@ifeltsweet . рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ

рдорд╣реАрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдмрд┐рдирд╛ рдкреНрд░реА-рд╣реБрдХ рдХреЗ рдХреЛрдИ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рджрд░реНрдЬрдиреЛрдВ рд╕рд░рдгреА рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдореБрдЭреЗ рдПрдХ рдкреВрд░реНрд╡ рд╣реБрдХ рдореЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП ...

@antonioaltamura рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛, рдиреАрдЪреЗ рдиреЗрд╡рд▓рд╛ 4.6 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const CollectionSchema = new Schema({
 field1: { type: [String], default: void 0 }, // <-- override the array default to be undefined
});

const Collection = mongoose.model('test', CollectionSchema);

Collection.create({}).
  then(doc => { console.log(doc); return doc; }).
  then(() => { process.exit(0); });

@ vkarpov15 рдЖрдкрдХрд╛ рдлрд┐рдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдиреЗрд╡рд▓рд╛ 4.7.0 рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрднреА рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рдЗрд╕рдореЗрдВ рдирдИ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ Model.save рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

@ cup22 рдХреНрдпрд╛ рдЖрдк рдПрдХ рдХреЛрдб рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдВрджрд░реНрднрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрд░реЗ рд▓рд┐рдП 4.7.1 рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/Automattic/mongoose/issues/2363#issuecomment -171988413 рд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬреНрдпрд╛рджрд╛ рд╕рд╛рдл рд╣реИред рдпрд╣ null рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм default: null рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

const CollectionSchema = new Schema({
  field1: { type: [String] },
});
CollectionSchema.methods.postconstructed = function () {
  this.field1 = null;
};
CollectionSchema.queue('postconstructed');

const Collection = mongoose.model('test', CollectionSchema);

Collection.create({}).then(doc => { console.log(doc); process.exit(0) });

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдпрд╣ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, new Collection({ field1: [] }) field1 === null рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╣реБрдХ рдерд╛ рдЬреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрд╛рдж рд╣реБрдЖ рдерд╛ рдЦрд╛рд▓реА рд╕рд░рдгреА рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдпрд╛ рдЗрд╕ рдмрдЧ рдХреЛ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП default: null рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдУрд╣, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const CollectionSchema = new Schema({
  field1: { type: [String], default: () => null },
});

рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддреА рд╣реИред рдЗрд╕рдореЗрдВ рдкрд╛рд╕-рдЗрди null , [] , рдпрд╛ Collection.create() рдпрд╛ new Collection() рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреИрд░-рдЦрд╛рд▓реА рд╕рд░рдгреА рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

@ vkarpov15 рдирдорд╕реНрддреЗ рд╡рд╣рд╛рдБ, рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдореИрдВ
рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЙрдкрд╛рдп рд╣реИ

@vikramkalta рдХреГрдкрдпрд╛ рдХреЛрдб рдирдореВрдиреЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдХреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЧрджреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИрдВред

рдирдорд╕реНрддреЗ, рдореИрдВ рдиреЗрд╡рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ 4.6.5 рдФрд░ рдЕрднреА рднреА рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

services: [{ type: Schema.Types.ObjectId, ref: 'Service', default: () => null }],

services: [{ type: Schema.Types.ObjectId, ref: 'Service', default: void 0 }],

@keyboard99 рдХреГрдкрдпрд╛ https://github.com/Automattic/mongoose/issues/1335#issuecomment -252129243 рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди

рдЙрди рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИред рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд╕рд╛рд░:

var BarSchema = new Schema({
    foos: {
        type: [FooSchema],
        default: undefined
    }
});

рдореЗрд░реЗ рд▓рд┐рдпреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ array.push рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрдВрдЧреА
:(

@GeneralG рдХрд┐рд╕реА рднреА рд╣реЛрдиреЗ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдПрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП doc.array = doc.array || []; рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ push() ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

efkan picture efkan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeneser picture jeneser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gustavomanolo picture gustavomanolo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rohan-paul picture rohan-paul  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tarun1793 picture tarun1793  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ