我想让用户能够在我的 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/