機能をリクエストしバグを報告しますか?
バグ
現在の動作は何ですか?
ベースモデルを使用してディスクリミネーターモデルドキュメントを取得する場合、 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 };
}
期待される動作は何ですか?
マングースはどの弁別子を選択するかを事前に知らないため、データベースからフェッチした後、これらのフィールドの選択を手動で解除する必要があります。
node.js、mongoose、MongoDBのバージョンを教えてください。
ノード6.9.2、マングース4.8.3、mongodb 3.4
この変更により、予期しない副作用が発生しているようです。
ベースモデルA
と、ディスクリミネーターモデルB
ます。
$slice
配列射影を使用してドキュメントをAにクエリすると、タイプA
結果のドキュメントはすべてのプロパティ( select: false
としてマークされたものを除く)を返しますが、タイプB
結果のドキュメントはselect: true
として_明示的に_マークされたプロパティまたはdefault
設定されたプロパティのみを返します。 default
設定されているものは、データベースに実際に格納されている値ではなく、デフォルト値を返します。 select: true
でマークされているプロパティがない場合は、 default
値を持つプロパティのみが返されます(ストア値ではなく、デフォルト値が返されます)。
編集:私のコメントを無視してください、問題はmongooseが内部のクエリに識別子キーを追加することでした。 解決策は、クエリで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を報告していただきありがとうございます、できるだけ早く調査します:+1: