标签: mongoid

如何在mongoid中强制执行独特的嵌入式文档

我有以下型号

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)

ruby-on-rails mongodb mongoid ruby-on-rails-3

9
推荐指数
2
解决办法
5157
查看次数

Rails 3中的用户身份验证示例,使用Devise,OmniAuth,Mongoid和JSON响应

我使用以下示例将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模板.任何指针都表示赞赏!

json ruby-on-rails devise mongoid omniauth

9
推荐指数
1
解决办法
5374
查看次数

Mongoid:通过数组ID查找

我通过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)

这将完成这项工作,但它会多次敲打数据库.

ruby ruby-on-rails mongodb mongoid

9
推荐指数
2
解决办法
5328
查看次数

如何使用Ruby和MongoId正确保存时区?

如果这是一个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日期?

ruby time timezone mongodb mongoid

9
推荐指数
1
解决办法
7013
查看次数

Ember-data和MongoDB,如何处理_id

我正在使用带有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映射.

ruby-on-rails mongodb mongoid ember.js ember-data

9
推荐指数
2
解决办法
4154
查看次数

相交的Mongoid"in"-Queries

根据显式合并的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)

难道我做错了什么?

ruby-on-rails mongodb mongoid

9
推荐指数
1
解决办法
4926
查看次数

使用Sidekiq处理作业时出现Mongoid/Moped错误

在运行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)

ruby-on-rails mongodb mongoid sidekiq moped

9
推荐指数
1
解决办法
2734
查看次数

有关从MongoMapper迁移到Mongoid的建议?

看起来Mongoid现在是基于性能和开发活动的Mongo的优秀ORM.不幸的是,我们在MongoMapper上并且需要迁移.

我们应该注意哪些问题或绊脚石?我们在Google上发现了一些过时的文章,并尝试在Mongoid Google网上论坛上发帖(虽然我们被禁止),但是会喜欢过去做过这种情况的SO成员的想法.

我们在Rails 3.2.12上.

谢谢!

ruby-on-rails mongodb mongomapper mongoid mongoid3

9
推荐指数
1
解决办法
844
查看次数

在mongo/mongoid中查找并删除所有内容

在mongoid中是否有任何方法可以找到并"读取"集合中的所有文档,同时还可以在一个原子查询中删除它们?

到目前为止我一直在使用:

Model.collection.find().to_json
Model.delete_all
Run Code Online (Sandbox Code Playgroud)

通过在这两个指令之间添加更多数据来收集,可以轻松解决这个问题.

mongodb mongoid

8
推荐指数
2
解决办法
3972
查看次数

不能将datetime_select与Mongoid一起使用

每次我尝试在视图中使用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)

ruby ruby-on-rails mongodb mongoid

8
推荐指数
1
解决办法
1503
查看次数