我想做一些相当简单的事情我相信:
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)|
是否可以将数据从mongoDB复制到Solr?我正在使用ruby + sinatra + mongoid.或者我需要通过rsolr与after_create,after_update等挂钩?
我在我的Rails应用程序中使用Mongoid.是否有任何关于如何存储和查询位置数据以及获取位于特定半径范围内的对象的教程?我一直在寻找,没有找到任何东西.
为什么在这种情况下不响应_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)
使用Rails 3.1.1让我的资产管道设置与Heroku/Cedar一起使用时遇到了一些麻烦
我已推送我的应用程序并成功启动,但没有消息说"准备资产管道"并且没有提供静态资产.由于没有slug编译时间或运行时资产编译,因此无法找到JS,CSS或图像.
任何帮助将不胜感激.
他们描述了在此链接部署期间应该发生的事情,我将在下面总结:
使用Heroku Cedar上的Rails 3.1应用程序,当你git push heroku时,你的资产将通过使用rake任务包exec rake assets:precompile预先编译为部署过程的一部分.
场景是:
帐户如何为其他帐户评分?这导致帐户上有两个列表.我评价的人和评价我的人.(my_ratings和ratings_given)
这归结为:
如何在同一实体中使用多个1-N关系在Mongoid中工作?
在Mongoid的文档中,它说你可以使用has_many和belongs_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)
文档没有涵盖这种情况,所以我认为你必须用:作为参数区分两者.
这甚至是遥控器吗?
使用嵌入对象有什么好处?
在我的实践中,当我不在其父级之外使用嵌入式对象时,这是非常罕见的.我的意思是通常的例子comments是embedded_in post:我需要在更新列表中显示最后的注释,我需要显示current_user等的注释.因此注释不能嵌入或者它将是一个痛苦的屁股.
因此,当我需要使用嵌入对象时,很少有用例.
问题是:为什么我应该使用嵌入式对象,即使在那些罕见的用例中,嵌入有什么好处?
我有这样的模型:
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)
但我想知道是否有捷径......
我正在Rails中构建一个论坛系统,以便更熟悉Rails和Mongoid.我想添加的一个功能是用户可以用来互相发送消息的私人消息系统论坛.在架构设计方面,我可以想到两个解决方案:
用户和消息是使用"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集合以及发送和接收的大量手动过滤和交错消息.努力.
在对话文档中嵌入消息.我将在下面提供用户,消息和对话的代码.会话通过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) 我有一个多域Rails 4应用程序,其中request.domainhttp请求确定我公开给定访问者的功能.
我的应用中的每个域都应该由自己的MongoDB数据库提供服务.例如domain1.com由db_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) mongoid ×10
mongodb ×8
arrays ×1
geospatial ×1
heroku ×1
mongo-shell ×1
mongoid4 ×1
ruby ×1
solr ×1