Node.js、MongoDB、Mongooseでコレクション名に"s"が付くのはなぜ?
Node.js、MongoDB、Mongoose におけるコレクション名の末尾の "s" について
Node.js、MongoDB、Mongoose を使用する場合、コレクション名に末尾に "s" を付ける必要があることに疑問を持つことがあるかもしれません。 これは、Mongoose がコレクション名を自動的に複数形に変換するためです。 このガイドでは、その理由と、この動作を回避する方法について説明します。
Mongoose がコレクション名を複数形に変換する理由
Mongoose は、MongoDB とシームレスに連携するように設計されています。 MongoDB では、コレクション名は小文字で、複数形にする必要があります。 Mongoose がコレクション名を自動的に複数形に変換することで、開発者はコレクション名を小文字にする必要がなくなり、MongoDB との互換性が向上します。
例
以下のコードを見てみましょう。
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('users', userSchema);
このコードでは、User
という名前のモデルが作成されます。 このモデルは users
コレクションに対応します。 これは、Mongoose が users
という名前を小文字にして、末尾に "s" を追加するためです。
コレクション名の末尾の "s" を回避する方法
コレクション名の末尾の "s" を回避したい場合は、以下の方法を使用できます。
mongoose.pluralize()
関数を無効にする
Mongoose には、mongoose.pluralize()
関数があります。 この関数は、コレクション名を複数形に変換します。 この関数を無効にすることで、コレクション名の末尾の "s" を回避できます。
mongoose.pluralize = () => {};
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
collection.name
プロパティを使用する
モデルには collection.name
プロパティがあります。 このプロパティは、コレクションの名前を取得します。 このプロパティを使用することで、コレクション名の末尾の "s" を取得できます。
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
console.log(User.collection.name); // Output: User
Mongoose は、コレクション名を自動的に複数形に変換します。 これは、MongoDB との互換性を向上させるためです。 コレクション名の末尾の "s" を回避したい場合は、mongoose.pluralize()
関数を無効にするか、collection.name
プロパティを使用できます。
- Mongoose のバージョン 5.x 以降では、
mongoose.pluralize()
関数は非推奨になっています。 代わりに、mongoose.pluralize.get()
関数を使用する必要があります。
const mongoose = require('mongoose');
mongoose.pluralize = () => {};
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
console.log(User.collection.name); // Output: User
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
console.log(User.collection.name); // Output: User
説明
このコード例では、以下の操作が行われます。
mongoose
モジュールをインポートします。mongoose.pluralize()
関数を無効にします。 これにより、Mongoose はコレクション名を自動的に複数形に変換しません。userSchema
という名前のスキーマを作成します。 このスキーマには、name
とemail
という 2 つのフィールドがあります。User
という名前のモデルを作成します。 このモデルはusers
コレクションに対応します。User.collection.name
プロパティを使用して、コレクションの名前を出力します。
このコードを実行すると、User
という出力が出力されます。 これは、Mongoose がコレクション名を複数形に変換していないことを示しています。
- このコードは、Mongoose バージョン 5.x 以降で使用できます。
他の方法
コレクション名を小文字にする
MongoDB では、コレクション名は小文字にする必要があります。 コレクション名を小文字にすれば、Mongoose は自動的に複数形に変換しません。
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const user = mongoose.model('user', userSchema);
mongoose.connect() 関数のオプションを使用する
mongoose.connect()
関数には、pluralize
オプションがあります。 このオプションを false
に設定することで、Mongoose はコレクション名を自動的に複数形に変換しません。
mongoose.connect('mongodb://localhost:27017/test', {
pluralize: false
});
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
カスタムコレクションクラスを使用する
Mongoose では、カスタムコレクションクラスを作成できます。 このクラスを使用して、コレクションの名前とスキーマを定義できます。 カスタムコレクションクラスを使用することで、Mongoose はコレクション名を自動的に複数形に変換しません。
const mongoose = require('mongoose');
const UserCollection = mongoose.model('User', new mongoose.Schema({
name: String,
email: String
}), 'User');
console.log(UserCollection.collection.name); // Output: User
createModel() 関数を使用する
Mongoose 6.x 以降では、createModel()
関数を使用できます。 この関数は、モデルを作成し、コレクション名を自動的に複数形に変換しません。
const mongoose = require('mongoose');
const User = mongoose.createModel('User', {
name: String,
email: String
});
console.log(User.collection.name); // Output: User
node.js mongodb mongoose