Mongoose: ์†์„ฑ์ด ์Šคํ‚ค๋งˆ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ๋นˆ ๋ฐฐ์—ด์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 02์›” 06์ผ  ยท  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 ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@antonioaltamura ์ด ๋ฌธ์ œ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” mongoose 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 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ๋ชฝ๊ตฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด๊ธฐ๊ฐ€ ๋น„๋ชฝ๊ตฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด๊ธฐ์™€ ๋™์ผํ•˜๋„๋ก ๋ชจ๋“  ๊ธฐ๋ณธ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์–ด๋–ป๊ฒŒ ๊ธฐ๋ณธ null์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ;-) ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋นˆ foo๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  Bar๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด mongo์—์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

์•Œ ๊ฒ ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ ๋ฌธ์„œ์— ๋นˆ foo๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ฌ์ฝคํ•œ. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ถฉ๋ถ„ํžˆ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? (์—ฌ๊ธฐ ๋ชฝ๊ตฌ์Šค 3.8.3)

Mathieumg: ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (3.8.15)

์˜ˆ, ์ด ๋ฌธ์ œ๋Š” ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (์‚ฌ์†Œํ•˜์ง€๋งŒ..
๋‚˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— pre๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค :) )

2014๋…„ 8์›” 25์ผ ์›”์š”์ผ ์˜คํ›„ 4์‹œ 49๋ถ„, Mathieu M-Gosselin <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/LearnBoost/mongoose/issues/1335#issuecomment -53328195
.

+1
์‚ฌ์ „ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ 3.8.15์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์œ ์ผํ•œ ๋Œ€์•ˆ์€ ์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด null ๋˜๋Š” false๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ผ๋ถ€ ๋ฐ”์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

        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๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— ๊ฒฐ์ •๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ด ๋™์ž‘์€ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์—ˆ์œผ๋ฏ€๋กœ ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๋•Œ ์กฐ์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด mongoose github์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ๋Œ“๊ธ€์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํžˆ ์ดํ•ดํ•˜๊ณ  ์žˆ๊ณ  ์ด๊ฒƒ์€ ์ข‹์€ ๋‹ต๋ณ€์ด ์—†๋Š” ๋ฌธ์ œ์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋จธ๋ฆฌ ์œ„๋กœ. ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด semver ๋•Œ๋ฌธ์— ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ ์ถฉ์ด ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋•Œ๋•Œ๋กœ ๋‹น์‹ ์ด ๋นˆ ๋ฐฐ์—ด์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ‹€๋ฆผ๊ณผ ํ•จ๊ป˜ ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์ „ ์ €์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ null foo๋ฅผ ํ‘œ์‹œํ•œ ๋‹ค์Œ ์‚ฌ์ „ ์ €์žฅ์—์„œ foo๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชป์ƒ๊ฒผ์ง€๋งŒ.

@viking ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

'์‚ฌ์ „' ์ €์žฅ ๋ฐฉ์‹์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ€๋” ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” JSON์ด ์‹ค์ œ๋กœ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ Java ๊ฐ์ฒด์— ๋งคํ•‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋‚ด 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: {} 
}

๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์•ˆ ์ธ์‚ฌ

๋‚ด๊ฐ€ ๊ฒŒ์‹œํ•œ ์‚ฌ์ „ ์ €์žฅ์ด ์•„๋‹Œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ž์‹์ด ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์‹ค์ œ๋กœ "์˜ค๋ฆฌ ํƒ€์ดํ•‘"Empty ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ์š”?

๋”ฐ๋ผ์„œ ์‚ฌ์ „ ์ €์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ด ๋ฌธ์ œ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” mongoose 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 mongoose 4.7.0์—์„œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์ƒˆ ๊ฐœ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•œ ๊ฐ’์€ ํฌํ•จ๋˜์ง€ ์•Š์ง€๋งŒ Model.save๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@cpup22 ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฐธ์กฐ๋œ ์Šคํฌ๋ฆฝํŠธ ๋Š” 4.7.1์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Automattic/mongoose/issues/2363#issuecomment -171988413์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. default: null ๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ 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 ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ์‚ฐ๋ฌธ์—์„œ ์ฝ”๋“œ๋กœ์˜ ๋ณ€ํ™˜์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” mongoose 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 ๋“ฑ๊ธ‰