node.js - 使用 Mongoose 动态创建集合

标签 node.js mongoose

我想让用户能够在我的 Node 应用程序中创建集合。我真的只在 Mongoose 的集合中看到过硬编码的例子。任何人都知道是否可以使用 Mongoose 动态创建集合?如果是这样,一个例子会很有帮助。

基本上我希望能够将不同“事件”的数据存储在不同的集合中。

I.E. 事件: 事件1, 事件2, ... 事件N

用户可以在那里创建自己的自定义事件并将数据存储在该集合中。最后,每个事件可能有成百上千行。我想让用户能够对他们的事件执行 CRUD 操作。我不想将每个事件数据存储在一个大集合中,而不是存储在一个不同的集合中。

我没有真正尝试过的示例,因为我只使用 Mongoose 创建了“硬编码”集合。我什至不确定是否可以根据用户请求在 mongoose 中创建一个动态的新集合。

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);

你能做到吗?

最佳答案

我认为这是一个糟糕的想法,但一个问题值得回答。您需要定义一个具有动态名称的模式,该名称允许其中包含“任何”类型的信息。执行此操作的函数可能与此函数有点相似:

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}},它是由“用户”提供的。为了保存它,我可以运行以下代码:

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.
});

您必须实现代码来保护您的查询。您不希望用户炸毁您的数据库。

关于node.js - 使用 Mongoose 动态创建集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15306916/

相关文章:

javascript - 向客户端发送ajax错误问题

node.js - 使用 nodejs gcloud api 删除 Google Cloud Storage 中的文件夹

javascript - 如何正确构建异步 Node 代码

node.js - 通过将 useNewUrlParser 设置为 true 来避免 "current URL string parser is deprecated"警告

node.js - fatal error : Schema hasn't been registered for model "a". 使用 mongoose.model(name, schema)

node.js - Handlebars 从数组中渲染所有内容

node.js - 管道到标准输出和可写流

node.js - 代理后面的 Electron 中的 Dugite/isomorphic-git

javascript - 通过 SerialPort 使用 Node.js 发送字节 (0xFF)

javascript - 我怎样才能在 Node js中的全局变量中分配 Mongoose 结果?