在我们的应用程序中,我们正在进行大量的插入/更新(从1k到100k),我注意到并没有保存所有记录.它可以在安全模式关闭的情况下节省90%-95%的记录.
使用safemode执行upsert会成功挂起所有记录但速度太慢.我记得在某处读到即使安全模式关闭,也应该没有理由更新/插入失败,除非服务器不可用.
我写了一个小应用程序来测试它,并包含下面的代码.它试图在Mongo中插入100,000个int,并且在运行后检查时,我在集合中看到大约90,000个记录.
(注意:我正在使用并行更新,因为我正在使用_id进行更新,而Mongo 2.0在使用_id时支持并行操作.当不使用Parallel.Foreach时,我仍然看到一些记录丢失虽然不是很好)
MongoServer server = MongoServer.Create(host);
MongoDatabase test = server.GetDatabase("testDB");
var list = Enumerable.Range(0, 100000).ToList();
using (server.RequestStart(test))
{
MongoCollection coll = test.GetCollection("testCollection");
Parallel.ForEach(list, i =>
{
var query = new QueryDocument("_id", i);
coll.Update(query, Update.Set("value",100),
UpdateFlags.Upsert, SafeMode.False);;
});
}
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是:快速进行大量更新的最佳方式是什么,成功率是100%?
我不能使用insert,因为我有许多进程写入Mongo并且无法确定某个文档是否存在,这就是我使用Upsert的原因.
所以我知道这个问题已被问了很多次,但我的问题更进一步.
在为我的应用程序建模时,我有两种类型的用户,它们与用户模型具有多态关联.如:
class User < ActiveRecord::Base
belongs_to :profileable, :polymorphic => true
end
class User_Type_1 < ActiveRecord::Base
has_one :user, :as => :profileable
end
class User_Type_2 < ActiveRecord::Base
has_one :user, :as => :profileable
end
Run Code Online (Sandbox Code Playgroud)
我这样做的原因,而不是STI,是因为User_Type_1有4个字段,User_Type_2有20个字段,我不希望用户表有这么多字段(是的24-ish字段不是很多,但我'大多数时候,我宁愿没有20个字段空了)
我理解这是如何工作的,我的问题是我希望注册表单只用于注册类型的用户,User_Type_1但签名表单用于两者.(我将有一个应用程序的管理员端,将创建用户User_Type_2)
我知道我可以after_sign_in_path_for(resource)以AppicationController某种方式使用覆盖在登录时重定向到网站的右侧部分.例如:
def after_sign_in_path_for(resource)
case current_user.profileable_type
when "user_type_1"
return user_type_1_index_path
when "user_type_2"
return user_type_1_index_path
end
end
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是如何让表单与Devise一起工作,只允许注册类型User_Type_1然后在sign_up之后签名?
另外,如果我以错误的方式解决这个问题,那么正确的方法是什么?
我在Heroku上有一个现有的New Relic帐户和一个现有的rails应用程序.我成功地将Heroku应用程序中的数据发送到New Relic.但是我希望在New Relic中看到每个dyno的内存占用量.
我能找到的所有文档都说要通过Heroku安装附加组件.我不希望它为我配置一个新帐户,我只是希望它链接到我当前的帐户.我怎样才能做到这一点?如果我已经安装了New Relic并且正在工作并且我添加了附加组件,它是否只链接到它已经配置的帐户?