标签: mongoid

Mongoid - 阵列管理?插入唯一值,如果存在则删除值?

我想做一些相当简单的事情我相信:

1)仅当该值尚未存在时才在数组字段中插入值

2)删除数组中存在的值

我只是不知道如何做这些事情......目前我只是插入我的值而不检查它是否已经存在:myArray << obj.id

谢谢,

亚历克斯

ps:使用Rails 3.0.3,mongo 1.1.5和mongoid 2.0.0.rc5

ps2:这是实现我想要的mongodb语法,但我不知道如何在mongoid中做到这一点

{ $addToSet : { field : value } }
Run Code Online (Sandbox Code Playgroud)

仅当数组不在数组中时才添加值,如果field是现有数组,否则在字段不存在时将字段设置为数组值.如果字段存在但不是数组,则会引发错误情况.

添加许多valuest.update

{ $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }
$pop

{ $pop : { field : 1  } }
Run Code Online (Sandbox Code Playgroud)

删除数组中的最后一个元素(1.1中的ADDED)

{ $pop : { field : -1  } }
Run Code Online (Sandbox Code Playgroud)

删除数组中的第一个元素(1.1中的ADDED)|

arrays ruby-on-rails mongodb mongoid

7
推荐指数
2
解决办法
9315
查看次数

如何在Solr中使用mongoDB?

是否可以将数据从mongoDB复制到Solr?我正在使用ruby + sinatra + mongoid.或者我需要通过rsolr与after_create,after_update等挂钩?

solr mongodb mongoid

7
推荐指数
2
解决办法
1万
查看次数

使用Rails/Mongoid进行地理空间查询的最佳教程是什么?

我在我的Rails应用程序中使用Mongoid.是否有任何关于如何存储和查询位置数据以及获取位于特定半径范围内的对象的教程?我一直在寻找,没有找到任何东西.

geospatial mongodb mongoid ruby-on-rails-3

7
推荐指数
2
解决办法
7597
查看次数

为什么respond_with没有从我的模型返回json?

为什么在这种情况下不响应_with响应json?我正在用一个明确的.json调用该动作(/tasks/4e3c1163a19d461203000106/items/4e4c27dfa19d46e0e400000a.json)

在我的控制器 -

class Tasks::TasksController < Tasks::BaseController
  respond_to :html, :js, :json

  def update
    @task = @taskgroup.update_task(params[:id], params[:task])
    @taskgroup.save
    respond_with @task
  end
end
Run Code Online (Sandbox Code Playgroud)

当我覆盖to_json并添加一个断点时,它没有被击中.回应是:

{}
Run Code Online (Sandbox Code Playgroud)

如果我用对to_json的显式调用替换respond_with:

respond_with @task do |format|
  format.json { render json: @task.to_json }
end
Run Code Online (Sandbox Code Playgroud)

反应很完美:

{
"_id":"4e4c27dfa19d46e0e400000a",
"assigned_to":null,
"comments"  [{"_id":"4e4c2fd7a19d46e127000014", 
[SNIP]
Run Code Online (Sandbox Code Playgroud)

它在后一种情况下工作正常,但我想弄清楚为什么第一个不起作用.这适用于我的应用程序中的其他控制器和模型.不确定它是否是一个mongoid的东西?(rails 3.0.9/mongoid 2.1.8)

mongoid ruby-on-rails-3

7
推荐指数
1
解决办法
2331
查看次数

Heroku没有预先编译我的资产来准备我的应用程序用于资产管道

使用Rails 3.1.1让我的资产管道设置与Heroku/Cedar一起使用时遇到了一些麻烦

我已推送我的应用程序并成功启动,但没有消息说"准备资产管道"并且没有提供静态资产.由于没有slug编译时间或运行时资产编译,因此无法找到JS,CSS或图像.

任何帮助将不胜感激.

他们描述了在此链接部署期间应该发生的事情,我将在下面总结:

使用Heroku Cedar上的Rails 3.1应用程序,当你git push heroku时,你的资产将通过使用rake任务包exec rake assets:precompile预先编译为部署过程的一部分.

heroku mongodb mongoid ruby-on-rails-3.1 asset-pipeline

7
推荐指数
1
解决办法
3269
查看次数

Mongoid(Rails)中的两个1 - N关系

场景是:

帐户如何为其他帐户评分?这导致帐户上有两个列表.我评价的人和评价我的人.(my_ratings和ratings_given)

这归结为:

如何在同一实体中使用多个1-N关系在Mongoid中工作?

在Mongoid的文档中,它说你可以使用has_manybelongs_to链接实体.

我目前在账户上有这个

  has_many :ratings, :as => "my_ratings"
  has_many :ratings, :as => "ratings_given"
Run Code Online (Sandbox Code Playgroud)

这个评分:

 belongs_to :user, :as => 'Rater'
 belongs_to :user, :as => 'Ratie'
Run Code Online (Sandbox Code Playgroud)

文档没有涵盖这种情况,所以我认为你必须用:作为参数区分两者.

这甚至是遥控器吗?

ruby-on-rails database-relations mongoid

6
推荐指数
1
解决办法
3587
查看次数

MongoDB:使用嵌入对象的好处

使用嵌入对象有什么好处?

在我的实践中,当我不在其父级之外使用嵌入式对象时,这是非常罕见的.我的意思是通常的例子comments是embedded_in post:我需要在更新列表中显示最后的注释,我需要显示current_user等的注释.因此注释不能嵌入或者它将是一个痛苦的屁股.

因此,当我需要使用嵌入对象时,很少有用例.

问题是:为什么我应该使用嵌入式对象,即使在那些罕见的用例中,嵌入有什么好处?

mongodb mongoid

6
推荐指数
1
解决办法
1220
查看次数

Rails + MongoID - 按属性查询

我有这样的模型:

class Lesson
  include Mongoid::Document

  field :title, :type => String
  field :category, :type => String
  field :price, :type => Float
  field :description, :type => String
  field :user_id, :type => String


  validates_presence_of :title
  validates_presence_of :category
  validates_presence_of :price
  validates_presence_of :user_id

  attr_accessible :title, :category, :description, :price

end
Run Code Online (Sandbox Code Playgroud)

我试图像这样查询:

@lessons_by_user = Lesson.find_by_user_id current_user.id
Run Code Online (Sandbox Code Playgroud)

我得到了:

Lesson:Class的未定义方法`find_by_user_id'

如何通过MongoID中的特定属性进行查询?

我知道如何这样做:

@lessons = Lesson.all(:conditions=>{:user_id=>current_user.id.to_s}) 
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有捷径......

ruby-on-rails mongodb mongoid

6
推荐指数
1
解决办法
5176
查看次数

使用Mongoid的MongoDB会话/私信消息架构

我正在Rails中构建一个论坛系统,以便更熟悉Rails和Mongoid.我想添加的一个功能是用户可以用来互相发送消息的私人消息系统论坛.在架构设计方面,我可以想到两个解决方案:

解决方案1

用户和消息是使用"has_many"和"belongs_to"相互链接的单独文档.

用户文档

has_many:messages_sent,:class_name =>'Message',:inverse_of =>:message_sender

has_many:messages_received,:class_name =>'Message',:inverse_of =>:message_recipient

消息文档

field:created,type:DateTime,default: - > {Time.now}

field:content,type:String

belongs_to:message_sender,:class_name =>'User',:inverse_of =>:messages_sent

belongs_to:message_recipient,:class_name =>'User',:inverse_of =>:messages_received

为了向用户显示他的收件箱,我会查看已some_user.messages_received排序:created并进行过滤,因此我有一个唯一的发件人ID列表,这些列表是在发送最后一封邮件时排序的some_user.

然后,为了显示特定的对话,我只是获取两个参与者之间的所有消息,并根据时间戳交错它们:

messages_in = some_user.messages_received.where(:message_sender => selected_correspondent)

messages_out = some_user.messages_sent.where(:message_recipient => selected_correspondent).

我不喜欢这个解决方案,因为它涉及使用"where"查询多次点击Messages集合以及发送和接收的大量手动过滤和交错消息.努力.

解决方案2(我现在正在使用)

在对话文档中嵌入消息.我将在下面提供用户,消息和对话的代码.会话通过has_and_belongs_to_many(nn,因为用户也可能有很多对话)链接到两个或多个用户.这也可能允许多用户对话.

我喜欢这个解决方案,因为为了向用户显示他的收件箱,我可以使用在Conversation文档中存储和更新的some_user.conversations顺序:last_message_received,不需要过滤.为了显示特定的对话,我不需要交错发送和接收的消息,因为消息已经以正确的顺序嵌入到对话文档中.

此解决方案的唯一问题是当您要添加消息时,找到由两个(或更多)用户共享的正确对话文档.这里建议一个解决方案:mongodb会话系统,但我不喜欢它,因为查询似乎相对昂贵,并且多用户对话的扩展看起来会变得棘手.相反,我在Conversation文档中有一个字段,该字段:lookup_hash是根据参与对话的每个用户的Object ID计算的SHA1哈希.这样,给定两个或更多用户,找到相应的对话文档(或者如果它还不存在则创建它)是微不足道的.

要向对话添加消息,我只使用Conversation.add_message(类方法,而非实例方法,因为对话可能尚不存在),为其提供发件人,收件人和新邮件对象.

我的问题是:考虑到Mongoid(或者一般只是NoSQL)架构设计最佳实践,我做了什么显然是错误的吗?我有什么办法可以改善我的解决方案吗?我使用哈希来查找对话的想法是个坏主意吗?

user.rb

class User
  include Mongoid::Document

  field :username, type: String
  field :joined, type: DateTime, default: ->{ Time.now } …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails schema-design mongodb mongoid

6
推荐指数
1
解决办法
1421
查看次数

如何在使用db.collection.insert()时动态切换MongoDB数据库?

我有一个多域Rails 4应用程序,其中request.domainhttp请求确定我公开给定访问者的功能.

我的应用中的每个域都应该由自己的MongoDB数据库提供服务.例如domain1.comdb_for_domain_1等提供.

我可以在MongoDB文档中阅读有关运行时持久性的内容

Mongoid.override_database("db_for_#{request.domain}")
Run Code Online (Sandbox Code Playgroud)

使我能够动态切换数据库.

但是当我绕过Mongoid并使用mongo Shell方法db.collection.insert()时,如何保持持久性呢?我仍然会在我的应用程序中执行此操作.

答案可能在关于集合访问MongoDB文档中,但我不明白.那么如何在此操作之前/期间切换数据库?:

MyModel.collection.insert({field_1: "Value 1", field_2: "Value 2"})
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails mongodb mongoid mongo-shell mongoid4

6
推荐指数
1
解决办法
817
查看次数