在Meteor中删除Mongo数据库集合

5
有没有办法在Meteor的服务器端JavaScript代码中删除Mongo数据库集合?(真正删除整个内容,而不仅仅是Meteor.Collection.remove({});“它的内容”)
此外,在Meteor的服务器端JavaScript代码中有没有一种方法可以删除Meteor.Collection而不删除相应的数据库集合?
为什么要这样做呢?
- 使用underscore或类似方法搜索子文档(用户文档的子文档,例如userdoc.mailbox[12345])会变得非常缓慢(例如对于大型邮箱)。 - 另一方面,将所有用户的所有消息(在邮箱示例的上下文中)放入一个大型数据库中,然后搜索*所有消息以查找一个或多个特定消息,结果也非常缓慢(对于具有大型邮箱的许多用户)。 - 还存在Mongo文档的大小限制,因此如果我将用户的所有消息存储在他/她的用户文档中,则邮箱的最大大小为<16 MB,包括所有其他用户数据。
所以我想为每个用户都有一个数据库,以便将其用作邮箱,然后一个消息的最大大小为16 MB(非常可接受),并且我可以使用mongo查询来搜索邮箱。
此外,由于我正在使用Meteor,因此很好的方式是,在用户登录时将此mongo db集合加载为Meteor.Collection。当用户停用帐户时,db应该被删除,如果用户仅注销,则应仅删除Meteor.Collection(并在再次登录时恢复)。
在某种程度上,我已经将这个东西做好了,每个用户都有自己的邮箱数据库,但是如果有人取消帐户,我必须手动删除该特定的Mongo Collection。此外,我必须始终保持所有mongo db集合处于活动状态,因为我无法删除它们。
以下是一个适用于每个用户邮件箱的良好工作的服务器端代码片段:
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中获得一组新的消息。
它的工作非常好,唯一缺少的是数据库集合搜索。
感谢任何提示!
*我之前在这里写了"dropping",这是一个完全错误的说法。我想说的是搜索。
3个回答

9
一个不使用私有方法的解决方案是:
myMailbox.rawCollection().drop();

我认为这种做法更好,因为Meteor可能会在没有任何警告的情况下随机删除或重命名私有方法。


这就是方法。2020年。谢谢你!我有一个高频表,如果我的应用程序在其中关闭,它会损坏该表。最简单的方法是删除它,然后我的应用程序会重建该表。 :) - Andy

4
您可以直接使用meteor中的myMailbox._dropCollection()完全删除集合myMailbox我知道这个问题很老,但当我搜索如何做到这一点时,它是第一个命中的结果。

1
这种方法实际上是首选的方法,因为它会在未初始化的mongo集合上抛出一个错误“ns not found”,而rawColleciton().drop()不会抛出该错误。 - Jankapunkt

1

在子文档中搜索...

为什么使用子文档?我猜是每个用户一个文档?

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

这是更好的方法,一组消息,每个消息都与用户有关联。这样,当进行发布订阅操作时,您可以过滤用户看到的内容。

将所有消息丢在一个数据库中对于拥有大型邮箱的许多用户来说非常慢

那是因为大多数 NoSQL 数据库(如果不是全部)都面向读取密集型操作而不太适合写入密集型操作。因此,写入(更新、插入、删除、擦除)需要更长时间。

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

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


嗨,约瑟夫!谢谢,但这就是我现在正在做的事情,但我需要每个用户一个数据库,以加快使用mong db查询搜索收件箱中一个或多个特定消息的速度。Mongo无法在用户文档中使用消息子文档来实现这一点。我了解到mongo db实际上支持编程删除数据库,只是我不知道如何在流星中实现。我的意思是......在Meteor中编程创建数据库没有问题...为什么删除会是一个问题呢? - Moritz Walter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接