【发布时间】:2013-12-11 13:50:43
【问题描述】:
有没有办法使用 Meteor 从服务器端 JavaScript 代码中删除 Mongo 数据库集合? (真的放下整个事情,不仅仅是Meteor.Collection.remove({});它的内容)
此外,是否还有一种方法可以从服务器端 JavaScript 代码中删除 Meteor.Collection 而不会删除相应的数据库集合?
为什么要这样做?
- 在带有下划线或类似内容的子文档(用户文档的子文档,例如
userdoc.mailbox[12345])中搜索结果非常缓慢(例如对于大型邮箱)。 - 另一方面,将所有用户的所有消息(在邮箱示例的上下文中)放在一个大数据库中,然后搜索*一条或多条特定消息的所有消息非常非常慢(对于许多大邮箱的用户)也是如此。
- Mongo 文档也有大小限制,所以如果我将用户的所有消息存储在他/她的用户文档中,邮箱的最大大小是
所以我想为我的每个用户建立一个数据库,将其用作邮箱,那么一封邮件的最大大小为 16 MB(非常可接受),我可以使用 mongo 查询来搜索邮箱。
此外,由于我使用的是 Meteor,所以每当用户登录时,最好将此 mongo db 集合加载为 Meteor.Collection。当用户停用他/她的帐户时,数据库当然应该是删除,如果用户刚刚退出,只有 Meteor.Collection 应该被删除(并在他/她再次登录时恢复)。
在某种程度上,我已经完成了这项工作,每个用户都有自己的邮箱数据库,但如果有人取消他/她的帐户,我必须手动删除这个特定的 Mongo Collection。此外,我确实一直保持所有 mongo db 集合作为 Meteor.Collections 活着,因为我无法丢弃它们。
这是一个运行良好的服务器端代码 sn-p,用于每个用户邮箱一个集合:
var mailboxes = {};
Meteor.users.find({}, {fields: {_id: 1}}).forEach(function(user) {
mailboxes[user._id] = new Meteor.Collection("Mailbox_" + user._id);
});
Meteor.publish("myMailbox", function(_query,_options) {
if (this.userId) {
return mailboxes[this.userId].find(_query, _options);
};
});
虽然客户端只是使用这段客户端代码订阅某个查询:
myMailbox = new Meteor.Collection("Mailbox_"+Meteor.userId());
Deps.autorun(function(){
var filter=Session.get("mailboxFilter");
if(_.isObject(filter) && filter.query && filter.options)
Meteor.subscribe("myMailbox",filter.query,filter.options);
});
因此,如果客户端操作会话变量“mailboxFilter”,则订阅会更新,并且用户会在 minimongo 中收到一堆新消息。
效果很好,唯一缺少的是 db collection drop。
感谢任何提示!
*我之前在这里写过“dropping”,完全是个错误。我的意思是搜索。
【问题讨论】:
标签: javascript mongodb meteor