我有以下型号
class Person
include Mongoid::Document
embeds_many :tasks
end
class Task
include Mongoid::Document
embedded_in :commit, :inverse_of => :tasks
field :name
end
Run Code Online (Sandbox Code Playgroud)
我如何确保以下内容?
person.tasks.create :name => "create facebook killer"
person.tasks.create :name => "create facebook killer"
person.tasks.count == 1
different_person.tasks.create :name => "create facebook killer"
person.tasks.count == 1
different_person.tasks.count == 1
Run Code Online (Sandbox Code Playgroud)
即任务名称在特定人员中是唯一的
检查了索引上的文档后,我认为以下内容可能有效:
class Person
include Mongoid::Document
embeds_many :tasks
index [
["tasks.name", Mongo::ASCENDING],
["_id", Mongo::ASCENDING]
], :unique => true
end
Run Code Online (Sandbox Code Playgroud)
但
person.tasks.create :name => "create facebook killer"
person.tasks.create :name => "create facebook killer" …Run Code Online (Sandbox Code Playgroud) 我使用以下示例将Devise和OmniAuth与我的Mongoid ORM设置集成在一起:
https://github.com/plataformatec/devise/wiki/Example-Applications
我的客户端代码主要是JavaScript(ExtJS),并依赖于JSON进行所有通信.我没有使用Rails模板.我希望构建一个多提供商身份验证模型,主要使用用户/通行证,Facebook和Twitter.我很难将完整的用户身份验证流程与我的应用程序堆栈放在一起.
我正在寻找一个使用JSON响应标准身份验证操作而不是重定向的示例,并提供与使用Mongoid的OmniAuth的集成.除了上面的例子,我还经历过Ryan Bates在Devise和OmniAuth上的Railscasts.到目前为止,我所做的每个例子都是ActiveRecord,或者是Rails模板.任何指针都表示赞赏!
我通过MapReduce获取了一些id.我按照某些标准对这些ID进行了排序,现在我需要按照这个特定的顺序获取这些对象:
MyModel.find(ids)
Run Code Online (Sandbox Code Playgroud)
对?但它返回的对象不是存储ids的顺序.看起来像是一样的
MyModel.where(:_id.in => ids)
Run Code Online (Sandbox Code Playgroud)
它不会以与存储的id相同的顺序返回获取的对象.
现在我可以做到这一点
ids.map{|id| MyModel.find(id)}
Run Code Online (Sandbox Code Playgroud)
这将完成这项工作,但它会多次敲打数据库.
如果这是一个noob问题,请原谅我:
我有一个应用程序,用户可以在他们的个人资料中设置自己的时区.
当有人添加阵容(特定于应用程序的术语)时,我会执行以下操作:
time = ActiveSupport::TimeZone.new(user.timezone).parse(
"Wednesday, 26 October, 2011 13:30:00"
)
# This outputs: 2011-10-26 13:30:00 +0200 - valid according to the user selected TZ
Run Code Online (Sandbox Code Playgroud)
然后我保存了阵容:
Lineup.create({
:date => time.gmtime,
:uid => user._id,
:pid => product._id
})
Run Code Online (Sandbox Code Playgroud)
这应该(理论上)将日期保存为gmtime,但在查看记录时我会得到以下信息:
{
"_id": ObjectId("4e9c6613e673454f93000002"),
"date": "Wed, 26 Oct 2011 13: 30: 00 +0200",
"uid": "4e9b81f6e673454c8a000001",
"pid": "4e9c6613e673454f93000001",
"created_at": "Mon, 17 Oct 2011 19: 29: 55 +0200"
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,日期字段错误 - 它仍然保持用户时区,它应该是GMT,而不是特定于时区.
如果我输出time.gmtime,我会得到正确的时间(应该保存):
2011-10-26 11:30:00 UTC (correct)
Run Code Online (Sandbox Code Playgroud)
有任何想法如何保存GMT日期,以便它实际保存GMT日期?
我正在使用带有rails和MongoDB的ember-data,并且对于在MongoDB中存储ID的方式存在问题 - 在_id字段中.
Ember-data将使用id作为ID的默认字段,所以我试图像这样覆盖它:
App.User = DS.Model.extend
primaryKey: "_id"
name: DS.attr "string"
image: DS.attr "string"
Run Code Online (Sandbox Code Playgroud)
这似乎在大部分时间都有效,但在某些情况下,我从ember说得到例外:
未捕获错误:断言失败:您的服务器返回带有密钥_id的哈希,但您没有映射
我怀疑这可能是ember-data中的一个错误,因为它仍处于开发阶段,但是我试图找到一种方法来将_id映射到服务器端的id中?我正在使用mongoid来进行mongo映射.
根据显式合并的mongoid文档(" 可查询#in - 默认为交叉"),我希望以下查询:
Contact.in(id: ['a', 'b']).in(id: ['b', 'c'])
Run Code Online (Sandbox Code Playgroud)
导致这样的事情:
=> #<Mongoid::Criteria
selector: {"_id"=>{"$in"=>["b"]}}
options: {}
class: Contact
embedded: false>
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了所有可以想象的情况的覆盖:
[1] pry(main)> Contact.in(id: ['a', 'b']).in(id: ['b', 'c'])
=> #<Mongoid::Criteria
selector: {"_id"=>{"$in"=>["b", "c"]}}
options: {}
class: Contact
embedded: false>
[2] pry(main)> Contact.in(id: ['a', 'b']).intersect.in(id: ['b', 'c'])
=> #<Mongoid::Criteria
selector: {"_id"=>{"$in"=>["b", "c"]}}
options: {}
class: Contact
embedded: false>
[3] pry(main)> Contact.in(id: ['a', 'b']).union.in(id: ['b', 'c'])
=> #<Mongoid::Criteria
selector: {"_id"=>{"$in"=>["b", "c"]}}
options: {}
class: Contact
embedded: false>
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
在运行Sidekiq时,我看到大量的工作失败,这些工作都与我的Mongo数据库的连接问题有关.我压力测试机器有很多负载,所以我排队了18,000多个工作,失败时重试5秒.一些工作(我猜测那些能够成功检索连接线程的工作者)工作得很好.然后我有很多其他人有这样的错误:
2013-12-26T19:25:35Z 13447 TID-m2biw WARN: {"retry"=>true, "queue"=>"default",
"class"=>"ParseFileWorker", "args"=>[{"filename"=>"/opt/media/AE-67452_36.XML"}],
"jid"=>"5d6c48fa94ed8c8da1b226fc", "enqueued_at"=>1388084903.6113343,
"error_message"=>"Could not connect to a primary node for replica set #
<Moped::Cluster:44552140 @seeds=[<Moped::Node resolved_address=\"127.0.0.1:27017\">]>",
"error_class"=>"Moped::Errors::ConnectionFailure", "failed_at"=>"2013-12-26T19:16:25Z",
"retry_count"=>3, "retried_at"=>2013-12-26 19:25:35 UTC}
Run Code Online (Sandbox Code Playgroud)
还有超时错误,如下所示:
Timeout::Error: Waited 0.5 sec
Run Code Online (Sandbox Code Playgroud)
注意,我正在运行Rails 4,并在https://github.com/mongoid/mongoid中从主分支中检出Mongoid代码.根据我的阅读,以前版本的Mongoid需要在Sidekiq作业完成处理时明确关闭连接.Mongoid 4应该自动完成.我无法确认它是否正在这样做.当作业排队太快,连接不可用或超时时,问题似乎是两倍.一些工人成功地打开了连接.有些工作必须等到重试解析.
我不完全确定这里最好的解决方案是什么.如果我慢慢排队工作,一切正常.不幸的是,这不是应用程序在现实世界中的运作方式.
我如何确保我的sidekiq作业获得完成工作所需的Moped/Mongoid连接,或者等待其中一个可用于处理?由于这个问题,看到了大量的例外/错误.下面是常见错误的堆栈跟踪:
2013-12-26T20:56:58Z 1317 TID-i70ms ParseFileWorker JID-0fc375d8fd9707e7d3ec3238 INFO: fail: 1.507 sec
2013-12-26T20:56:58Z 1317 TID-i70ms WARN: {"retry"=>true, "queue"=>"default", "class"=>"ParseFileWorker", "args"=>[{"filename"=>"/opt/media/AC-19269_287.XML"}], "jid"=>"0fc375d8fd9707e7d3ec3238", "enqueued_at"=>1388091410.0421875, "error_message"=>"Waited 0.5 sec", "error_class"=>"Timeout::Error", "failed_at"=>2013-12-26 20:56:58 UTC, "retry_count"=>0}
2013-12-26T20:56:58Z 1317 TID-i70ms WARN: Waited 0.5 sec
2013-12-26T20:56:58Z 1317 TID-i70ms …Run Code Online (Sandbox Code Playgroud) 看起来Mongoid现在是基于性能和开发活动的Mongo的优秀ORM.不幸的是,我们在MongoMapper上并且需要迁移.
我们应该注意哪些问题或绊脚石?我们在Google上发现了一些过时的文章,并尝试在Mongoid Google网上论坛上发帖(虽然我们被禁止),但是会喜欢过去做过这种情况的SO成员的想法.
我们在Rails 3.2.12上.
谢谢!
在mongoid中是否有任何方法可以找到并"读取"集合中的所有文档,同时还可以在一个原子查询中删除它们?
到目前为止我一直在使用:
Model.collection.find().to_json
Model.delete_all
Run Code Online (Sandbox Code Playgroud)
通过在这两个指令之间添加更多数据来收集,可以轻松解决这个问题.
每次我尝试在视图中使用Datetime_select时,应用程序都会抛出属性错误.
Mongoid::Errors::UnknownAttribute:
Problem:
Attempted to set a value for 'fromtime(1i)' which is not allowed on the model Event.
Summary:
Without including Mongoid::Attributes::Dynamic in your model and the attribute does not already exist in the attributes hash, attempting to call Event#fromtime(1i)= for it is not allowed. This is also triggered by passing the attribute to any method that accepts an attributes hash, and is raised instead of getting a NoMethodError.
Resolution:
You can include Mongoid::Attributes::Dynamic if you expect to be writing …Run Code Online (Sandbox Code Playgroud)