Ruby Mongoid/Moped更新嵌入文档-ArgumentError-参数数量错误(2代表1)
我在更新Ruby/Sinatra应用程序中的嵌入式文档时遇到问题。我试图在update语句中使用位置运算符“$”,以便从嵌入的数组中选择正确的文档。但这是抛出一个“ArgumentError-错误数量的参数(2代表1)”错误 带有硬编码数组索引的简单update语句可以正常工作。所以也许Mongoid/Moped不支持位置操作员?。。。虽然从我所能看到的,它看起来应该 有人知道最好的方法是什么吗?在我的控制器中使用Ruby,有没有其他方法来确定子文档索引,而不必遍历它们——这是计划B,但看起来非常脆弱 这是我的基本设置:我有“客户” 。。。嵌入“联系人” 在我的控制器中,我获得了客户(pk)和要更新的特定嵌入文档(联系pk)的ID:Ruby Mongoid/Moped更新嵌入文档-ArgumentError-参数数量错误(2代表1),ruby,mongodb,sinatra,mongoid,moped,Ruby,Mongodb,Sinatra,Mongoid,Moped,我在更新Ruby/Sinatra应用程序中的嵌入式文档时遇到问题。我试图在update语句中使用位置运算符“$”,以便从嵌入的数组中选择正确的文档。但这是抛出一个“ArgumentError-错误数量的参数(2代表1)”错误 带有硬编码数组索引的简单update语句可以正常工作。所以也许Mongoid/Moped不支持位置操作员?。。。虽然从我所能看到的,它看起来应该 有人知道最好的方法是什么吗?在我的控制器中使用Ruby,有没有其他方法来确定子文档索引,而不必遍历它们——这是计划B,但看起来非
update
类方法实际上是Customer。默认范围为.update
,这意味着update
实际上是Mongoid::Criteria
中的update
方法,并且:
请注意,它只接受一个属性参数?这就解释了错误消息。您可能希望update
的工作方式与MongoDB shell或JavaScript界面中的工作方式相同
首先,您需要找到感兴趣的文档,然后致电update
:
Customer.where('_id' => Moped::BSON::ObjectId(pk), 'contacts._id' => Moped::BSON::ObjectId(contact_pk))
.update($set => { 'contacts.$.first_name' => 'Bob' })
成功了!我真的很难理解MongoDB shell和使用Mongoid/Moped在Ruby中工作的东西之间的区别。您知道有任何教程或更高级别的文档演示如何组合基于Mongoid::Criteria的查询吗?虽然这正是我需要的方向盘-谢谢!
class Contact
include Mongoid::Document
field :first_name, type: String
attr_accessible :first_name
embedded_in :customer
end
Customer.update(
{
"_id" => Moped::BSON::ObjectId(pk),"contacts._id" => Moped::BSON::ObjectId(contact_pk)
},
{
$set => {"contacts.$.first_name" => "Bob" }
}
)
# Update the first matching document atomically.
#
# @example Update the first matching document.
# context.update({ "$set" => { name: "Smiths" }})
#
# @param [ Hash ] attributes The new attributes for the document.
#
# @return [ nil, false ] False if no attributes were provided.
#
# @since 3.0.0
def update(attributes = nil)
update_documents(attributes)
end
Customer.where('_id' => Moped::BSON::ObjectId(pk), 'contacts._id' => Moped::BSON::ObjectId(contact_pk))
.update($set => { 'contacts.$.first_name' => 'Bob' })