有没有办法从Meteor的服务器端JavaScript代码中删除Mongo数据库集合? (真的放弃了整个事情,而不只是Meteor.Collection.remove({});
它的内容)
此外,还有一种方法可以从服务器端JavaScript代码中删除Meteor.Collection而不删除相应的数据库集合吗?
为什么这样做?
userdoc.mailbox[12345]
)会变得安静缓慢(例如,对于大邮箱)。所以我希望为每个用户创建一个数据库,将其用作邮箱,然后一封邮件的最大大小为16 MB(非常可接受),我可以使用mongo查询搜索邮箱。
此外,由于我正在使用Meteor,因此每当用户登录时,将这个mongo db集合作为Meteor.Collection加载会很好。当用户停用他/她的帐户时,db当然应该是丢弃,如果用户刚刚注销,则只应删除Meteor.Collection(并在他/她再次登录时恢复)。
在某种程度上,我已经完成了这项工作,每个用户都有一个自己的邮箱数据库,但如果有人取消他/她的帐户,我必须手动删除这个特定的Mongo集合。此外,我已经将所有mongo db集合保持为Meteor.Collections,因为我无法删除它们。
这是一个运行良好的服务器端代码段,用于每个用户的一个邮箱集合:
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 drops。
感谢任何暗示!
*我在这里写了“丢弃”,这是一个完全错误。我的意思是搜索。
答案 0 :(得分:7)
不使用私有方法的解决方案是:
myMailbox.rawCollection().drop();
在我看来这是更好的,因为Meteor可以在没有任何警告的情况下随机删除或重命名私有方法。
答案 1 :(得分:4)
您可以直接从meteor中完全删除myMailbox
集合myMailbox._dropCollection()
。
我知道问题已经过时了,但是当我搜索如何做到这一点时,这是第一次打击
答案 2 :(得分:1)
在子文档中搜索...
为什么要使用子文档?我认为每个用户的文档?
每封邮件必须是自己的文件
这是一种更好的方式,一组消息,每一个都是用户的id。这样,您可以过滤用户在进行发布订阅时看到的内容。
对于许多拥有大邮箱的用户来说,删除一个数据库中的所有邮件的速度非常慢
这是因为大多数NoSQL数据库(如果不是全部)都面向读取密集型操作而不是写入密集型操作。因此,写作(更新,插入,删除,擦除)将花费更多时间。
此外,一些在线服务(我认为是Twitter或雅虎)会在停用帐户时告诉您:“您的数据将在接下来的N天内被删除。”或类似的东西。一个原因是您的数据需要时间删除。
用户无论如何都要离开,因此您可以告诉用户您的帐户已停用,并且您的数据将在接下来的几天内从我们的数据库中删除。要添加它,以便您可以立即响应用户,请通过向其发送空白回调来异步执行删除操作。