mongodb - 即时创建新的 Meteor 集合

标签 mongodb meteor mongo-collection

是否可以即时创建新的 Meteor 集合?我想根据一些路径名创建 foo_barbar_bar 我想这应该是一个全局变量(这样我就可以在整个应用程序中访问它)。
像这样的东西:

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

这里的事情是我应该从 URL 获取我的 prefix 变量,所以如果我在 if (Meteor.isClient) 之外声明它,我会得到一个错误:ReferenceError:未定义窗口。有可能做那样的事情吗?

编辑:使用 Akshats 的第一次迭代回答我的项目 js:http://pastie.org/6411287

最佳答案

我不完全确定这会起作用:

你需要它分为两部分,第一个部分加载你之前设置的集合(在客户端和服务器上)

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 转义的。

关于mongodb - 即时创建新的 Meteor 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15214667/

相关文章:

javascript - Meteor 中的 Mongo 集合正在插入垃圾

java - 使用 MongoDB java 驱动程序备份和恢复数据库

javascript - Meteor:如何使用 Meteor.call 从服务器返回数据

javascript - 如何在 Meteor JS 中通过 ID 选择用户?

android - Meteor Mobile App 无法连接到服务器

mongodb - 将 mongoDB 的所有集合作为输入传递给 mapreduce hadoop

php - PHP 中的 MongoDb 更新

node.js - Mongoose mongodb - 从集合中获取所有数据

mongodb - 在调用 Execute 之前,插入操作必须具有部署集

java - Java Spring 中是否可以进行条件聚合?