26

Nodeアプリでコレクションを作成できるようにしたい。私は実際にマングースのコレクションでハードコーディングの例を見ただけです。マングースで動的にコレクションを作成できるかどうか誰か知っていますか?もしそうなら、例は非常に役に立ちます。

基本的に、さまざまな「イベント」のデータをさまざまなコレクションに保存できるようにしたいと考えています。

IEイベント:event1、event2、... eventN

ユーザーは独自のカスタムイベントを作成し、そのコレクションにデータを保存できます。最終的に、各イベントには数百/数千の行が含まれる可能性があります。ユーザーがイベントに対してCRUD操作を実行できるようにしたいと思います。1つの大きなコレクションに保存するのではなく、各イベントデータを別のコレクションに保存したいと思います。

マングースを使用して「ハードコードされた」コレクションを作成しただけなので、実際に試した例はありません。ユーザーの要求に基づいて動的な新しいコレクションをマングースで作成できるかどうかさえわかりません。

var mongoose = require('mongoose');
mongoose.connect('localhost', 'events');

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

var event1= new Event1({ name: 'something' });
event1.save(function (err) {
  if (err) // ...
  console.log('meow');
});

上記は、「Event1」をコレクションとしてハードコーディングするとうまく機能します。動的コレクションを作成するかどうかはわかりません。

var mongoose = require('mongoose');
mongoose.connect('localhost', 'events');

...

var userDefinedEvent = //get this from a client side request
...

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

あなたはそれをすることができますか?

4

7 に答える 7

22

これは実装するのにひどい考えだと思いますが、質問は答えに値します。'Any'タイプの情報を許可する動的な名前でスキーマを定義する必要があります。これを行う関数は、この関数に少し似ている場合があります。

var establishedModels = {};
function createModelForName(name) {
    if (!(name in establishedModels)) {
        var Any = new Schema({ any: Schema.Types.Mixed });
        establishedModels[name] = mongoose.model(name, Any);
    }
    return establishedModels[name];
}

これで、名前などの制限なしに情報を許可するモデルを作成できます。{name: 'hello', content: {x: 1}}'user'によって提供されるこのように定義されたオブジェクトを想定します。これを保存するために、次のコードを実行できます。

var stuff = {name: 'hello', content: {x: 1}}; // Define info.
var Model = createModelForName(name); // Create the model.
var model = Model(stuff.content); // Create a model instance.
model.save(function (err) { // Save
    if (err) {
        console.log(err);
    }
});

クエリは非常によく似ており、モデルをフェッチしてからクエリを実行します。

var stuff = {name: 'hello', query: {x: {'$gt': 0}}}; // Define info.
var Model = createModelForName(name); // Create the model.
model.find(stuff.query, function (err, entries) {
    // Do something with the matched entries.
});

クエリを保護するためのコードを実装する必要があります。ユーザーにデータベースを爆破させたくありません。

于 2013-03-09T10:13:00.440 に答える
6

ここのmongoドキュメントから:データモデリング

特定の状況では、単一のコレクションではなく、複数のコレクションに情報を保存することを選択する場合があります。

さまざまな環境やアプリケーションのログドキュメントを保存するサンプル収集ログについて考えてみます。ログコレクションには、次の形式のドキュメントが含まれています。

{ログ: "dev"、ts:...、情報:...} {ログ: "デバッグ"、ts:...、情報:...}

ドキュメントの総数が少ない場合は、ドキュメントをタイプ別にコレクションにグループ化できます。ログについては、logs.devやlogs.debugなどの個別のログコレクションを維持することを検討してください。logs.devコレクションには、開発環境に関連するドキュメントのみが含まれます。

一般に、コレクションの数が多いと、パフォーマンスが大幅に低下することはなく、非常に優れたパフォーマンスが得られます。個別のコレクションは、高スループットのバッチ処理にとって非常に重要です。

于 2014-01-04T18:55:16.350 に答える
5

20の異なるイベントがあるとします。各イベントには10​​0万のエントリがあります...したがって、これがすべて1つのコレクションに含まれている場合は、CRUD操作ごとにイベントごとにコレクションをフィルタリングする必要があります。

特にイベント名がクライアントコードに依存しているために変更される可能性がある場合は、すべてのイベントを同じコレクションに保持することをお勧めします。代わりに、名前とユーザー参照にインデックスを付けます。

mongoose.Schema({
  name: { type: String, index: true },
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', index: true } 
});

さらに、あなたは少し後ろ向きに問題に遭遇したと思います(しかし私は間違っているかもしれません)。ユーザーのコンテキスト内でイベントを検索していますか、それともイベント名のコンテキスト内でユーザーを検索していますか?前者のように感じます。そもそもイベント名ではなく、ユーザー参照でパーティション化する必要があります。

ユーザーのすべてのイベントを検索する必要がなく、ユーザーとイベント名を一緒に処理する必要がある場合は、複合インデックスを使用できます。

schema.index({ user: 1, name: 1 });

何百万ものドキュメントを扱っている場合は、必ず自動インデックスをオフにしてください。

schema.set('autoIndex', false);

この投稿には、コレクションの命名と特定のスキーマの使用に関する興味深い情報が含まれています。

Mongooseで既存のコレクションにアクセスするにはどうすればよいですか?

于 2013-11-28T05:41:43.967 に答える
0

次のことを試すことができます。

var createDB = function(name) {

  var connection = mongoose.createConnection(
    'mongodb://localhost:27017/' + name);

  connection.on('open', function() {
    connection.db.collectionNames(function(error) {
      if (error) {
        return console.log("error", error)
      }
    });

  });
  connection.on('error', function(error) {
    return console.log("error", error)
  });

}
connection.db.collectionNamesを使用してコレクション名を取得することが重要です。そうしないと、データベースが作成されません。

于 2015-05-01T16:25:38.653 に答える
0

このメソッドは私に最適です。この例では、ユーザーごとに動的コレクションを作成します。各コレクションは、対応するユーザー情報(ログインの詳細)のみを保持します。最初に、関数dynamicModelを別のファイルで宣言します:example model.js

/* model.js */
'use strict';

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;


  function dynamicModel(suffix) {
      var addressSchema = new Schema(
          {
               "name" : {type: String, default: '',trim: true},
               "login_time" : {type: Date},
               "location" : {type: String, default: '',trim: true},
          }
  );

     return mongoose.model('user_' + suffix, addressSchema);

  }

module.exports = dynamicModel;

コントローラファイルの例user.jsで、動的コレクションを作成する最初の関数と、特定のコレクションにデータを保存する2番目の関数

/* user.js */
var  mongoose = require('mongoose'),

function CreateModel(user_name){//function to create collection , user_name  argument contains collection name

  var Model  = require(path.resolve('./model.js'))(user_name);

}

function save_user_info(user_name,data){//function to save user info , data argument contains user info
     var UserModel  = mongoose.model(user_name) ;
     var usermodel  = UserModel(data);
              usermodel.save(function (err) {

               if (err) {
                  console.log(err);
                } else {
                 console.log("\nSaved");
                }
           });
}
于 2019-04-09T11:12:16.040 に答える
0

はい、私たちはそれを行うことができます。私はそれとその動作を試しました。

参照コード:

app.post("/",function(req,res){

  var Cat=req.body.catg;
  const link= req.body.link;
  const rating=req.body.rating;
  Cat=mongoose.model(Cat,schema);
  const item=new Cat({
  name:link,
  age:rating
  });
 item.save();
  res.render("\index");
});
于 2020-01-22T14:49:52.713 に答える
0

Mageshvaranリファレンスコードを試しました。

そしてこのコードは私のために働きます

   router.post("/auto-create-collection", (req, res) => {
  var reqData = req.body; // {"username":"123","password":"321","collectionName":"user_data"}

  let userName = reqData.username;
  let passWord = reqData.password;
  let collectionName = reqData.collectionName;

  // create schema
  var mySchema = new mongoose.Schema({
    userName: String,
    passWord: String,
  });

  // create model
  var myModel = mongoose.model(collectionName, mySchema);

  const storeData = new myModel({
    userName: userName,
    passWord: passWord,
  });
  storeData.save();

  res.json(storeData);
});
于 2022-02-02T05:11:49.573 に答える