Node.js、MongoDB、Mongooseでサブドキュメント配列の_idプロパティを生成しない
Node.js、MongoDB、Mongoose でサブドキュメント配列の _id プロパティ作成を抑制する方法
この問題を解決するには、以下の方法がある。
_id オプションを false に設定する
Mongoose スキーマで、サブドキュメント配列に対して _id
オプションを false
に設定することで、_id
プロパティ作成を抑制できます。
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
name: String,
subdocuments: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Subdocument',
_id: false,
}],
});
const Model = mongoose.model('Model', schema);
サブドキュメントスキーマから _id
プロパティを削除することで、_id
プロパティ作成を抑制できます。
const mongoose = require('mongoose');
const subdocumentSchema = new mongoose.Schema({
name: String,
});
const schema = new mongoose.Schema({
name: String,
subdocuments: [subdocumentSchema],
});
const Model = mongoose.model('Model', schema);
mongoose-auto-increment
パッケージを使用することで、サブドキュメント配列の _id
プロパティに自動的にインクリメントされる値を割り当てることができます。
const mongoose = require('mongoose');
const autoIncrement = require('mongoose-auto-increment');
const subdocumentSchema = new mongoose.Schema({
name: String,
});
autoIncrement.initialize(mongoose.connection);
const schema = new mongoose.Schema({
name: String,
subdocuments: [subdocumentSchema],
});
schema.plugin(autoIncrement.plugin, {
model: 'Model',
field: 'subdocuments._id',
startAt: 1,
incrementBy: 1,
});
const Model = mongoose.model('Model', schema);
これらの方法のいずれかを使用して、Node.js、MongoDB、Mongoose でサブドキュメント配列の _id
プロパティ作成を抑制できます。
const mongoose = require('mongoose');
// サブドキュメントスキーマ
const subdocumentSchema = new mongoose.Schema({
name: String,
});
// メインスキーマ
const schema = new mongoose.Schema({
name: String,
// サブドキュメント配列
subdocuments: [subdocumentSchema],
});
// モデル作成
const Model = mongoose.model('Model', schema);
// サブドキュメントを追加
const model = new Model({
name: 'メインドキュメント',
subdocuments: [{
name: 'サブドキュメント1',
}, {
name: 'サブドキュメント2',
}],
});
// 保存
model.save((err) => {
if (err) {
console.error(err);
return;
}
console.log('保存成功');
});
このコードは、サブドキュメント配列の _id
プロパティ作成を抑制する方法を示しています。
実行結果
保存成功
注意事項
- サブドキュメント配列の
_id
プロパティ作成を抑制すると、サブドキュメントを個別に参照できなくなる場合があります。
これらの点に注意して、上記のサンプルコードを参考にしてください。
virtual
プロパティを使用して、サブドキュメント配列の _id
プロパティを仮想的に作成できます。
const mongoose = require('mongoose');
const subdocumentSchema = new mongoose.Schema({
name: String,
});
const schema = new mongoose.Schema({
name: String,
subdocuments: [subdocumentSchema],
});
schema.virtual('subdocuments._id').get(function() {
return this._id;
});
const Model = mongoose.model('Model', schema);
このコードでは、subdocuments
配列の各要素に _id
という仮想プロパティを作成しています。このプロパティは、実際にはデータベースに保存されませんが、コード内でアクセスすることができます。
const mongoose = require('mongoose');
const subdocumentSchema = new mongoose.Schema({
name: String,
});
const Subdocument = mongoose.model('Subdocument', subdocumentSchema);
const customSchemaType = new mongoose.SchemaType({
type: Subdocument,
_id: false,
});
const schema = new mongoose.Schema({
name: String,
subdocuments: [customSchemaType],
});
const Model = mongoose.model('Model', schema);
このコードでは、Subdocument
というカスタムスキーマタイプを作成しています。このタイプは、Subdocument
スキーマに基づいていますが、_id
プロパティを含みません。
node.js mongodb mongoose