๊ธฐ๋ฅ ์ ์์ฒญํ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ ๋ณด๊ณ ํ์๊ฒ ์ต๋๊น?
๋ฒ๋
ํ์ฌ ํ๋์ ๋ฌด์์
๋๊น?
๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ํ๋ณ์ ๋ชจ๋ธ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๊ฒฝ์ฐ select: false
์ธ์ ํ์ง ์์ต๋๋ค.
ํ์ฌ ๋์์ด ๋ฒ๊ทธ์ธ ๊ฒฝ์ฐ ์ฌํ ๋จ๊ณ๋ฅผ ์ ๊ณตํ์ญ์์ค.
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const co = require('co');
const chalk = require('chalk');
const GITHUB_ISSUE = `test-constructor-emit-bug`;
exec()
.then(() => {
console.log(chalk.green(`Successfully ran program`));
process.exit(0);
})
.catch(error => {
console.log(chalk.red(`Error: ${ error }\n${ error.stack }`));
process.exit(2);
});
function exec() {
return co(function* () {
const db = mongoose.createConnection(`mongodb://localhost:27017/${ GITHUB_ISSUE }`);
const { Base, Discriminator } = createModels(db);
const { baseDoc, discrimDoc } = yield seedDb({ Base, Discriminator });
const docFromDb = yield Base.findById(discrimDoc._id) // does not honor select: false
// const docFromDb = yield Discriminator.findById(discrimDoc._id); // honors select: false
console.log(docFromDb.internal); // should not log `internal.password`
});
}
function seedDb(models) {
return co(function*() {
const { Base, Discriminator } = models;
yield [Base.remove({}), Discriminator.remove({})];
const baseDoc = yield Base.create({ internal: { diseases: ['Malaria'] }});
const discrimDoc = yield Discriminator.create({ internal: {
diseases: ['MS'],
password: 'plain_test_password_ftw'
}});
return { baseDoc, discrimDoc };
});
}
function createModels(db) {
const baseSchema = new mongoose.Schema({
internal: {
diseases: [{ type: String }]
}
});
const Base = db.model('Base', baseSchema);
const discriminatorSchema = new mongoose.Schema({
internal: {
password: { type: String, select: false }
}
});
const Discriminator = Base.discriminator('Discriminator', discriminatorSchema);
return { Base, Discriminator };
}
์์๋๋ ๋์์ ๋ฌด์์
๋๊น?
mongoose๋ ์ด๋ค ํ๋ณ์๋ฅผ ์ ํํ ์ง ๋ฏธ๋ฆฌ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ํ ํด๋น ํ๋๋ฅผ ์๋์ผ๋ก ์ ํ ์ทจ์ํด์ผ ํฉ๋๋ค.
node.js, mongoose ๋ฐ MongoDB ๋ฒ์ ์ ์ธ๊ธํ์ญ์์ค.
๋
ธ๋ 6.9.2, ๋ชฝ๊ตฌ์ค 4.8.3, mongodb 3.4
์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์๊ธฐ์น ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
ํ๋ณ์ ๋ชจ๋ธ B
๊ฐ ์๋ ๊ธฐ๋ณธ ๋ชจ๋ธ A
B
์์ต๋๋ค.
$slice
๋ฐฐ์ด ํ๋ก์ ์
์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ ๋ํด A๋ฅผ ์ฟผ๋ฆฌํ ๋ A
์ ํ์ ๊ฒฐ๊ณผ ๋ฌธ์๋ ๋ชจ๋ ์์ฑ( select: false
๋ก ํ์๋ ๋ฌธ์ ์ ์ธ)์ ๋ฐํํ๋ ๋ฐ๋ฉด B
์ ํ์ ๊ฒฐ๊ณผ ๋ฌธ์๋ select: true
๋ก ํ์๋ ์์ฑ ๋๋ default
์ค์ ๋ ์์ฑ๋ง _๋ช
์์ ์ผ๋ก_ ๋ฐํํฉ๋๋ค. default
์ค์ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ๋ก ์ ์ฅ๋ ๊ฐ์ด ์๋๋ผ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํฉ๋๋ค. select: true
๋ก ํ์๋ ์์ฑ์ด ์์ผ๋ฉด default
๊ฐ์ด ์๋ ์์ฑ๋ง ๋ฐํ๋ฉ๋๋ค(์ ์ฅ ๊ฐ์ด ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ค์ ํ์๋จ).
ํธ์ง : ๋ด ์๊ฒฌ์ ๋ฌด์ํ์ญ์์ค. ๋ฌธ์ ๋ ๋ชฝ๊ตฌ์ค๊ฐ ํ๋ ์๋์ ์ฟผ๋ฆฌ์ ํ๋ณ์ ํค๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค. ํด๊ฒฐ์ฑ
์ ์ฟผ๋ฆฌ์์ slice
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค.
๋ด๊ฐ ๋๋ฌด ๋นจ๋ฆฌ ๋งํ์ ์๋ ์๋ค. ๋ฒ์ 4.13.4์ ์ต์ master
์ปค๋ฐ์ผ๋ก ํ
์คํธํ ๊ฒฐ๊ณผ slice
ํ๋ก์ ์
๋ง ์ฌ์ฉํ ๋ ๋์ผํ ๋์์ด ๋ํ๋ฉ๋๋ค.
์ด ๋ฌธ์ ์ ์๋ ์๋ฅผ ์ทจํ๊ณ ๋์์ ์ฌํํ๋๋ก ์์ ํ์ต๋๋ค.
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const co = require('co');
const chalk = require('chalk');
mongoose.set('debug', true);
const GITHUB_ISSUE = `default-values-on-discriminator-documents`;
exec()
.then(() => {
console.log(chalk.green(`Successfully ran program`));
process.exit(0);
})
.catch(error => {
console.log(chalk.red(`Error: ${error}\n${error.stack}`));
process.exit(2);
});
function exec() {
return co(function* () {
const db = mongoose.createConnection(`mongodb://localhost:27017/${GITHUB_ISSUE}`);
const { Base, Discriminator } = createModels(db);
const { baseDoc, discrimDoc } = yield seedDb({ Base, Discriminator });
const baseDocsFromDbWithSlice = yield Base.find().slice('array', 1)
const baseDocsFromDb = yield Base.find()
console.log(baseDocsFromDbWithSlice); // Discriminator document returns default value for propA (and not propB), base document returns stored value - unexpected
console.log(baseDocsFromDb); // Discriminator and base document returns stored value for propA - expected
});
}
function seedDb(models) {
return co(function* () {
const { Base, Discriminator } = models;
yield [Base.remove({}), Discriminator.remove({})];
const baseDoc = yield Base.create({
propA: 'Hi',
array: ["a", "b"]
});
const discrimDoc = yield Discriminator.create({
propA: 'Hi',
propB: 'Hello',
array: ["a", "b"]
});
return { baseDoc, discrimDoc };
});
}
function createModels(db) {
const baseSchema = new mongoose.Schema({
propA: { type: String, default: 'default value' },
array: [{type: String}],
});
const Base = db.model('Base', baseSchema);
const discriminatorSchema = new mongoose.Schema({
propB: { type: String}
});
const Discriminator = Base.discriminator('Discriminator', discriminatorSchema);
return { Base, Discriminator };
}
์ด ๋์์ 4.11.13
์์ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ฌํ์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๊บผ์ด ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
@bruun ์ ์ ๊ณ