4

オンザフライで新しい Meteor コレクションを作成することは可能ですか? foo_barグローバル変数であるはずのパス名を作成したり、それに依存したりしたいと思いbar_barます(アプリケーション全体でアクセスできるようにします)。
何かのようなもの:

var prefix = window.location.pathname.replace(/^\/([^\/]*).*$/, '$1');
var Bar = new Meteor.Collection(prefix+'_bar');

ここで重要なのは、prefix変数を URL から取得する必要があるため、変数を外部で宣言するとif (Meteor.isClient)エラーが発生することです: ReferenceError: window is not defined。そのようなことをすることはまったく可能ですか?

編集: Akshats の最初の反復を使用して、私のプロジェクト js に答えます: http://pastie.org/6411287

4

2 に答える 2

4

これが機能するかどうかは完全にはわかりません。

これは2つに分けて必要です。最初は、以前に設定したコレクションを(クライアントとサーバーの両方で)ロードするためのものです。

var collections = {};
var mysettings = new Meteor.Collection('settings') //use your settings

//Startup
Collectionlist = mysettings.find({type:'collection'});

Collectionlist.forEach(function(doc) {
    collections[doc.name] = new Meteor.Collection(doc.name);
})'

そして、サーバーにコレクションを追加するために少し必要です。

Meteor.methods({
    'create_server_col' : function(collectionname) {
       mysettings.insert({type:'collection', name: collectionname});
       newcollections[collectionname] = new Collection(collectionname);
       return true;
    }
});

そして、クライアントでそれらを作成する必要があります。

//Create the collection:

Meteor.call('create_server_col', 'My New Collection Name', function(err,result) {
    if(result) {
        alert("Collection made");
    }
    else
    {
        console.log(err);
    }
}

繰り返しになりますが、これはすべてテストされていないので、うまくいけば試してみます。

編集

おそらく以下が機能するはずです。コレクションが最初に存在するかどうかを確認するために、いくつかのチェックを追加しました。meteor reset上記のコードからバグをソートするために使用する前に、実行してください。

var collections = {};
var mysettings = new Meteor.Collection('settings')

if (Meteor.isClient) {
  Meteor.startup(function() {
    Collectionlist = mysettings.find({type:'collection'});

    Collectionlist.forEach(function(doc) {
        eval("var "+doc.name+" = new Meteor.Collection("+doc.name+"));
    });
  });
  Template.hello.greeting = function () {
    return "Welcome to testColl.";
  };

  var collectionname=prompt("Enter a collection name to create:","collection name")

  create_collection(collectionname);

  function create_collection(name) {
    Meteor.call('create_server_col', 'tempcoll', function(err,result) {
        if(!err) {
            if(result) {
                //make sure name is safe
                eval("var "+name+" = new Meteor.Collection('"+name+"'));
                alert("Collection made");
                console.log(result);
                console.log(collections);
            } else {
                alert("This collection already exists");
            }
        }
        else
        {
            alert("Error see console");
            console.log(err);
        }
    });
  }
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
    Collectionlist = mysettings.find({type:'collection'});

    Collectionlist.forEach(function(doc) {
        collections[doc.name] = new Meteor.Collection(doc.name);
    });
  });

  Meteor.methods({
    'create_server_col' : function(collectionname) {
       if(!mysettings.findOne({type:'collection', name: collectionname})) {
        mysettings.insert({type:'collection', name: collectionname});

        collections[collectionname] = new Meteor.Collection(collectionname);

        return true;
       }
       else
       {
        return false; //Collection already exists
       }
    }
  });
}

また、名前がjavascriptでエスケープされていることを確認してください。

于 2013-03-05T07:22:31.253 に答える
3

物事ははるかに簡単になりました:

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
db.createCollection("COLLECTION_NAME", (err, res) => {
    console.log(res);
});

これをサーバー メソッドで実行します。

于 2015-12-30T17:21:18.147 に答える