【问题标题】:Dropping a Mongo Database Collection in Meteor在 Meteor 中删除 Mongo 数据库集合
【发布时间】: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


    【解决方案1】:

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

    myMailbox.rawCollection().drop();
    

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

    【讨论】:

    • 就是这样。 2020.谢谢你。我有一个高频表,如果我的应用程序在中间关闭,它会损坏表。最容易删除它,我的应用程序会重建表。 :)
    【解决方案2】:

    您可以直接从流星中完全删除集合myMailboxmyMailbox._dropCollection()

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

    【讨论】:

    • 这个方法其实是首选方法,因为它会在未初始化的mongo集合"ns not found"上抛出错误,而rawColleciton().drop()不会抛出这个错误
    【解决方案3】:

    正在子文档中搜索...

    为什么要使用子文档?我想每个用户一个文档?

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

    这是一个更好的方法,一个消息集合,每个都被标识给用户。这样,您可以过滤用户在发布订阅时看到的内容。

    对于许多拥有大邮箱的用户来说,将所有消息放入一个数据库中的速度非常慢

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

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

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

    【讨论】:

    • 嘿约瑟夫!谢谢,但这就是我现在正在做的事情,但是我需要每个用户为用户的收件箱拥有一个数据库,以加快使用 mong db 查询在收件箱中搜索一个或多个特定消息的过程。 Mongo 不能对用户文档中的消息子文档执行此操作。我读到 mongo db 实际上支持以编程方式删除数据库,我只是不知道如何在流星中做到这一点。我的意思是.. 在 Meteor 中以编程方式创建数据库没有问题.. 为什么 drop 应该是一个?
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2018-02-12
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多