我错误地删除了上次查询中的一些文档,有没有办法回滚我的上一个查询mongo集合.
这是我的上一个查询:
db.datas.remove({ "name" : "some_x_name"})
Run Code Online (Sandbox Code Playgroud)
有没有回滚/撤消选项?我可以收回我的数据吗?
假设我使用的是一个相当标准的32字符十六进制GUID,我已经确定,因为它是为我的用户随机生成的,所以它非常适合用作分片键来水平扩展我将要存储的MongoDB集合的写入用户信息(以及写入缩放是我主要关心的问题).
我还知道,我需要从至少4个分片开始,因为流量预测和一些测试环境完成的基准工作.
最后,我对我的初始数据大小(平均文档大小*初始用户数)有了一个不错的想法 - 大约120GB左右.
我想让初始加载更好,更快,并尽可能多地利用所有4个分片.如何预分割这些数据,以便利用4个分片并最大限度地减少初始数据加载期间需要在分片上发生的移动,分割等数量?
这是我的看法,我不确定这是对还是错:
日记日志是"重做"日志.它记录了数据文件的修改.
例如,我想将一条记录的字段值从"a"更改为"b",然后mongodb将找到如何修改dbfile(包括所有命名空间,数据,索引等),然后mongodb写入修改期刊.
之后,mongodb对dbfile进行了所有真正的修改.如果这里出现问题,当mongoDB重新启动时,它将读取日志(如果存在).然后它将更改dbfile的alter以使数据集保持一致.
因此,在日志中,不会记录要更改的数据,而是如何更改dbfile.
我对吗?我在哪里可以获得有关期刊格式的更多信息?
我有一个事件集合,我正在查找特定事件的类别,然后我使用$ push语句更新我的其他集合.问题是,当两个事件具有相同的类别时,它将创建一个我不想要的副本.
我知道有关upserts但我不确定它们是否是关于此的最佳方式?当涉及到如何实际编写一个与"$ push"-statement一起使用的upsert时,我有点困惑.
这就是我的更新现在的样子:
self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})
Run Code Online (Sandbox Code Playgroud)
..哪里:
UserCampaign = {
"id": campaign['id'],
"name": campaign['name']
}
Run Code Online (Sandbox Code Playgroud)
"UserCampaign"会不时地填充相同的信息,因为我的收藏可能会非常庞大,我想尽可能高效地完成这项工作.
TLDR; 我想更新使用"推送"找到的文档中的数组,而不会有重复的风险.
将测试数据插入MongoDB时,我通常只使用一个for
循环来执行大量的单个插入.使用2.4及以下版本,这非常快(约2秒),例如:
> db.timecheck.drop();
true
> start = new Date(); for(var i = 0; i < 100000; i++){db.timecheck.insert({"_id" : i})}; end = new Date(); print(end - start);
2246
Run Code Online (Sandbox Code Playgroud)
用2.6尝试同样的事情要慢得多(约37秒):
> db.timecheck.drop();
true
> start = new Date(); for(var i = 0; i < 100000; i++){db.timecheck.insert({"_id" : i})}; end = new Date(); print(end - start);
37169
Run Code Online (Sandbox Code Playgroud)
这要慢得多.那么,为什么新版本存在这样的差异,我该如何解决呢?