mongooseが常にコレクション名の最後にsを追加するのはなぜですか


120

たとえば、このコードの結果、「datas」というコレクションが作成されます

var Dataset = mongoose.model('data', dataSchema);

このコードにより、「users」というコレクションが作成されます

var User = mongoose.model('user', dataSchema);

ありがとう


3
これはRailsの規約です。オブジェクト「user」があり、「users」コレクションに保存します。マングースでも同じだと思います。
Sergio Tulentsev、

うん、興味深いことに、var Dataset = mongoose.model( 'datas'、dataSchema); データと呼ばれるコレクションになります。
Bob Ren

複数化ロジックは、その馬鹿げたものではないようです(または、賢いですが、期待したことに依存します)。私はあなたがそれが正確にどのように機能するかを見つけることができると確信しています(ソースを見つけてください)。
Sergio Tulentsev、2012年

2
@SergioTulentsev、これはルビーではありませんが、github.com

7
参考までに。データは複数形、データの単数形はデータム
Luis Sieira

回答:


200

Mongooseはコレクション名を複数にすることで賢くしようとしています。ただし、必要に応じて強制することもできます。

var dataSchema = new Schema({..}, { collection: 'data' })


31
"s"を追加することでフレームワークがどのようにインテリジェントになるか理解できませんが、これは悪い考えです。そのマングースは別として素晴らしいフレームワークです。
Roberto

14
削除すると下位互換性が失われる、古い貧弱な選択です。だから私たちはそれに固執することを選びました。
aaronheckmann 2013

18
「s」を追加するだけでなく、名前の正しい複数形を作成します。「mouse」を使用したインスタンスを試してください。「mice」という名前のコレクションを取得するか、「person」を使用して「people」を取得します。これらの名前がどこから来たのかを理解するのは私を夢中にさせていました:-)
Enrico Giurin

3
これは非常に変わっています。別のインターフェイスからコレクションを照会する必要があるときに、コレクションを特別にクエリするためにどの名前を使用しますか?
Xsmael 2017

8
「ブラシ」を定義し、「ブラシ」という名前のコレクションがあったので、私はおかしくなりました。私はそれを30分近く定義した場所を見つけようとしましたが、何も見つかりませんでした。私は思った:「多分それはスマートでそれを追加します。おそらくそうではありませんが、それではそれをしましょう... FUUUUUUU」
Fusseldieb

49

mongoose.modelのAPI構造は次のとおりです。

Mongoose#model(name, [schema], [collection], [skipInit])

mongooseが行うことは、コレクション引数が渡されない場合、Mongooseはモデル名を複数形にしてコレクション名を生成します。この動作が気に入らない場合は、コレクション名を渡すか、スキーマコレクション名オプションを設定してください。

例:

var schema = new Schema({ name: String }, { collection: 'actor' });

または

schema.set('collection', 'actor');

または

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);

30

mongoose 5.x以降では、完全に無効にすることができます。

mongoose.pluralize(null);

モデル名とコレクション名の両方を定義する必要がないため、最善の解決策です。
Nezih

これは間違いなく最良のアプローチです。
netishix

1
このようなマングースの賢さについて学ぶのに数時間かかりました。とにかく-この解決策を見つけてうれしい。ところで:それはまた、コレクション名の自動的な小文字の大文字化を避けます。
BernhardFürst

8

文字列を3番目の引数として追加するだけで、コレクションの実際の名前を定義できます。例を拡張してdatauserそれぞれの名前をそのままにします。

var Dataset = mongoose.model('data', dataSchema, 'data');

var User = mongoose.model('user', dataSchema, 'user');

2

コレクション名を3番目のパラメーターとして追加できます。Typescriptを使用した例を参照してください。

import DataAccess = require('../DataAccess');
import IUser = require("../../Models/Interfaces/IUser");

var mongoose = DataAccess.mongooseInstance;
var mongooseConnection = DataAccess.mongooseConnection;

class UserSchema {
        static get schema () {
        var schema =  mongoose.Schema({
            _id : {
                type: String
            },
            Name: {
                type: String,
                required: true
            },
            Age: {
                type: Number,
                required: true
            }
        });

        return schema;
    }
}
var schema:any = mongooseConnection.model<IUser>("User", 
UserSchema.schema,"User");
export = schema;

2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

mongoose.pluralize(null)Mongooseファイルに行を追加すると、コレクション名の複数形化が防止されます。この行をモデルファイルに追加する必要はありません。

ここに見られるよう



-2

このコマンドを実行すると、Mongooseがモデルをコンパイルします

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var child = mongoose.model('child', schema);

最初の引数は、モデルが対象とするコレクションの単一の名前です。Mongoose は、モデル名の複数形の小文字バージョンを自動的に検索します。したがって、上記の例の場合、モデルの子はデータベースの子コレクション用です。

注:この.model()関数はスキーマのコピーを作成します。を呼び出す前に、フックを含め、スキーマに必要なすべてのものを追加したことを確認してください.model()


あなたは問題を再現していますか?
ペドロJR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.