繁体   English   中英

在Meteor中删除Mongo数据库集合

[英]Dropping a Mongo Database Collection in Meteor

有没有办法从Meteor的服务器端JavaScript代码中删除Mongo数据库集合? (真的放弃了整个事情,而不仅仅是Meteor.Collection.remove({});它的内容)

另外,还有一种方法可以从服务器端JavaScript代码中删除Meteor.Collection而不删除相应的数据库集合吗?

为什么这样?

  • 使用下划线或类似搜索子文档(用户文档的子文档,例如userdoc.mailbox[12345] )会变得安静缓慢(例如,对于大邮箱)。
  • 另一方面,将所有用户的所有消息(在邮箱示例的上下文中)放在一个大数据库中,然后搜索*所有消息以查找一个或多个特定消息,结果非常非常慢(对于许多大用户而言)邮箱)。
  • Mongo文档还有大小限制,因此如果我将用户的所有消息存储在他/她的用户文档中,则邮箱的最大大小与所有其他用户数据一起小于16 MB。

所以我想为我的每个用户创建一个数据库,将其用作邮箱,然后一条消息的最大大小为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 drop。

谢谢你的任何暗示!

*我在这里热情地写了“丢弃”,这是一个完全错误。 我的意思是搜索。

不使用私有方法的解决方案是:

myMailbox.rawCollection().drop();

这在我看来更好,因为Meteor可以在没有任何警告的情况下随机丢弃或重命名私有方法。

您可以使用myMailbox._dropCollection()直接从meteor中删除myMailbox集合。

我知道这个问题很老,但是当我搜索如何做到这一点时,这是第一次打击

在子文档中搜索...

为什么要使用子文档? 我认为每个用户的文档?

每条消息必须是它自己的文档

这是一种更好的方式,一组消息,每一个都是用户的身份。 这样,您可以过滤用户在进行发布订阅时看到的内容。

对于具有大邮箱的许多用户而言,丢弃一个数据库中的所有消息对于非常慢是非常慢的

这是因为大多数NoSQL DB(如果不是全部)都面向读取密集型操作,而写入密集型则不多。 因此,写入(更新,插入,删除, 擦除 )将花费更多时间。

此外,一些在线服务(我认为是Twitter或雅虎)会在停用帐户时告诉您:“您的数据将在接下来的N天内被删除。” 或类似的东西。 一个原因是您的数据需要时间删除。

用户无论如何都要离开,因此您可以告诉用户您的帐户已停用,并且您的数据将在接下来的几天内从我们的数据库中删除。 要添加它,以便您可以立即响应用户,通过向其发送空白回调异步执行删除操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM