マングースで動的にコレクションを作成する
Dynamically Create Collection With Mongoose
解決:
これを実装するのはひどい考えだと思いますが、質問は答えに値します。 'Any'タイプの情報を許可する動的な名前でスキーマを定義する必要があります。これを行う関数は、この関数に少し似ている場合があります。
varestablishedModels = {}; function createModelForName(name){if(!(foundedModelsの名前)){var Any = new Schema({any:Schema.Types.Mixed}); EstablishmentedModels [name] = mongoose.model(name、Any); } returnestablishedModels [名前]; }これで、名前などの制限なしに情報を許可するモデルを作成できます。このように定義されたオブジェクトを想定します、{name: 'hello'、content:{x:1}}、これは 'user'によって提供されます。これを保存するために、次のコードを実行できます。
var stuff = {name: 'hello'、content:{x:1}}; //情報を定義します。 var Model = createModelForName(name); //モデルを作成します。 var model = Model(stuff.content); //モデルインスタンスを作成します。 model.save(function(err){//保存if(err){console.log(err);}});クエリは非常によく似ており、モデルをフェッチしてからクエリを実行します。
var stuff = {name: 'hello'、query:{x:{'$ gt':0}}}; //情報を定義します。 var Model = createModelForName(name); //モデルを作成します。 model.find(stuff.query、function(err、entries){//一致したエントリで何かを実行します。});クエリを保護するためのコードを実装する必要があります。ユーザーにデータベースを爆破させたくありません。
ここのmongoドキュメントから:データモデリング
特定の状況では、単一のコレクションではなく、複数のコレクションに情報を保存することを選択する場合があります。
さまざまな環境やアプリケーションのログドキュメントを保存するサンプル収集ログについて考えてみます。ログコレクションには、次の形式のドキュメントが含まれています。
{ログ: 'dev'、ts:...、情報:...} {ログ: 'デバッグ'、ts:...、情報:...}
ドキュメントの総数が少ない場合は、ドキュメントをタイプごとにコレクションにグループ化できます。ログについては、logs.devやlogs.debugなどの個別のログコレクションを維持することを検討してください。 logs.devコレクションには、開発環境に関連するドキュメントのみが含まれます。
一般に、コレクションの数が多いと、パフォーマンスが大幅に低下することはなく、非常に優れたパフォーマンスが得られます。個別のコレクションは、高スループットのバッチ処理にとって非常に重要です。
20の異なるイベントがあるとします。各イベントには100万のエントリがあります...したがって、これがすべて1つのコレクションに含まれている場合は、すべてのCRUD操作のイベントでコレクションをフィルタリングする必要があります。
特にイベント名がクライアントコードに依存しているために変更される可能性がある場合は、すべてのイベントを同じコレクションに保持することをお勧めします。代わりに、名前とユーザー参照にインデックスを付けます。
mongoose.Schema({name:{type:String、index:true}、user:{type:mongoose.Schema.Types.ObjectId、ref: 'User'、index:true}});さらに、あなたは少し後ろ向きに問題に遭遇したと思います(しかし私は間違っているかもしれません)。ユーザーのコンテキスト内でイベントを検索していますか、それともイベント名のコンテキスト内でユーザーを検索していますか?前者のように感じます。そもそもイベント名ではなく、ユーザー参照でパーティション化する必要があります。
ユーザーのすべてのイベントを検索する必要がなく、ユーザー名とイベント名を一緒に処理する必要がある場合は、複合インデックスを使用できます。
schema.index({ユーザー:1、名前:1});何百万ものドキュメントを扱っている場合は、必ず自動インデックスをオフにしてください。
schema.set( 'autoIndex'、false);
この投稿には、コレクションの命名と特定のスキーマの使用に関する興味深いものがあります。
マングースで既存のコレクションにアクセスするにはどうすればよいですか?