JavaScript、Node.js、MongoDBで開発!Mongooseのidと_idを使いこなそう
Mongoose における id
と _id
の違い
定義
id
: Mongoose によって生成される仮想プロパティです。デフォルトでは_id
フィールドの値を文字列に変換したものですが、カスタマイズも可能です。_id
: MongoDB ドキュメントのデフォルトの識別子フィールドです。24バイトの ObjectId として自動生成され、各ドキュメントを一意に識別します。
使用例
id
:- クライアント側アプリケーションでドキュメントを識別するために使用されます。
- 人間にとってより読みやすく、分かりやすい形式で表示できます。
_id
:- ドキュメントを検索したり更新したりする際に使用します。
- ObjectId として直接使用したり、16進数文字列に変換して使用したりできます。
id
プロパティにアクセスするには、ドット表記 (例:document.id
) を使用します。- Mongoose は
findById()
やfindOne()
などのメソッドで_id
を自動的に使用します。 id
は仮想プロパティなので、スキーマで定義する必要もありません。_id
は Mongoose スキーマで定義する必要はありませんが、通常は存在します。
id
: Mongoose が提供する仮想プロパティで、クライアント側アプリケーション向け_id
: MongoDB の内部的な識別子
- 複数のドキュメント間の参照関係を表すには、
_id
を参照フィールドとして使用します。 _id
は変更できませんが、id
は変更可能です。
const mongoose = require('mongoose');
// スキーマ定義
const userSchema = new mongoose.Schema({
name: String,
email: String,
});
// モデル作成
const User = mongoose.model('User', userSchema);
// ドキュメント作成
const user = new User({
name: 'Taro Yamada',
email: '[email protected]',
});
// _id の取得
console.log(user._id); // ObjectId: 626987db765a4b20c49df34e
// id プロパティの取得
console.log(user.id); // 626987db765a4b20c49df34e (ObjectId の 16進数文字列表現)
// ドキュメント保存
user.save((err) => {
if (err) {
console.error(err);
return;
}
console.log('ドキュメントが保存されました');
});
// ドキュメント検索
User.findById(user._id, (err, doc) => {
if (err) {
console.error(err);
return;
}
if (doc) {
console.log('ドキュメントが見つかりました:', doc);
} else {
console.log('ドキュメントが見つかりませんでした');
}
});
mongoose
モジュールをインポートします。- ユーザーを表すスキーマを定義します。
User
モデルを作成します。- 新しいユーザーオブジェクトを作成します。
_id
とid
プロパティの値を出力します。- ユーザーオブジェクトをデータベースに保存します。
_id
を使用してユーザードキュメントを検索します。- 検索結果を出力します。
デフォルトでは、Mongoose は _id
フィールドを自動生成しますが、カスタムの id
フィールドを定義することもできます。
const mongoose = require('mongoose');
// スキーマ定義
const userSchema = new mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId, // デフォルトの _id フィールド
customId: String, // カスタム id フィールド
name: String,
email: String,
});
// モデル作成
const User = mongoose.model('User', userSchema);
// ドキュメント作成
const user = new User({
customId: 'user123', // カスタム id の設定
name: 'Taro Yamada',
email: '[email protected]',
});
// ドキュメント保存
user.save((err) => {
if (err) {
console.error(err);
return;
}
console.log('ドキュメントが保存されました');
});
// カスタム id でドキュメントを検索
User.findOne({ customId: 'user123' }, (err, doc) => {
if (err) {
console.error(err);
return;
}
if (doc) {
console.log('ドキュメントが見つかりました:', doc);
} else {
console.log('ドキュメントが見つかりませんでした');
}
});
この例では、customId
という名前の新しいフィールドをスキーマに追加しています。このフィールドには、ユーザーが定義した ID 値を格納できます。ドキュメントを保存するときは、customId
フィールドに値を設定する必要があります。その後、このフィールドを使用してドキュメントを検索できます。
findByIdAndUpdate() メソッドの使用
findByIdAndUpdate()
メソッドを使用して、既存のドキュメントを検索し、同時に更新することができます。このメソッドは、id
または _id
のどちらを使用してドキュメントを検索することもできます。
const mongoose = require('mongoose');
// ... (スキーマとモデルの定義は前の例と同じ)
// ドキュメント検索と更新
User.findByIdAndUpdate(user._id, { email: '[email protected]' }, (err, doc) => {
if (err) {
console.error(err);
return;
}
if (doc) {
console.log('ドキュメントが更新されました:', doc);
} else {
console.log('ドキュメントが見つかりませんでした');
}
});
この例では、findByIdAndUpdate()
メソッドを使用して、_id
で指定されたドキュメントを検索し、email
フィールドを更新しています。
findOneAndUpdate()
メソッドは、findByIdAndUpdate()
メソッドと似ていますが、一致する最初のドキュメントのみを更新します。
const mongoose = require('mongoose');
// ... (スキーマとモデルの定義は前の例と同じ)
// ドキュメント検索と更新
User.findOneAndUpdate({ customId: 'user123' }, { name: 'Jiro Yamada' }, (err, doc) => {
if (err) {
console.error(err);
return;
}
if (doc) {
console.log('ドキュメントが更新されました:', doc);
} else {
console.log('ドキュメントが見つかりませんでした');
}
});
注意事項
findByIdAndUpdate()
およびfindOneAndUpdate()
メソッドを使用する場合は、更新されたドキュメントが返されることに注意してください。古いドキュメントを取得するには、findById()
メソッドを使用する必要があります。- カスタム
id
フィールドを使用する場合は、そのフィールドがユニークであることを確認する必要があります。
javascript node.js mongodb