Ruby on rails 3 使用Mongo Update和$set插入字段(抛出错误)

Ruby on rails 3 使用Mongo Update和$set插入字段(抛出错误),ruby-on-rails-3,mongodb,updates,Ruby On Rails 3,Mongodb,Updates,好吧,这可能是一个愚蠢的问题,但我一直在阅读和尝试不同的查询,出于某种原因,我无法在不抛出错误的情况下使其工作。这是我第一次使用MongoDB,它是在RoR项目中。我们为慈善机构设置了一个twitter句柄字段,但最初并没有将其放入模型中。所以我们用慈善机构填充DB,但是现在没有一个有twitter句柄字段。我将它添加到模型中,因此现在所有其他创建的对象都将拥有它 我的问题是,当我尝试更新数据库中已有的慈善机构时,我不断收到一个指向$set的错误: namespace :add_tw_handl

好吧,这可能是一个愚蠢的问题,但我一直在阅读和尝试不同的查询,出于某种原因,我无法在不抛出错误的情况下使其工作。这是我第一次使用MongoDB,它是在RoR项目中。我们为慈善机构设置了一个twitter句柄字段,但最初并没有将其放入模型中。所以我们用慈善机构填充DB,但是现在没有一个有twitter句柄字段。我将它添加到模型中,因此现在所有其他创建的对象都将拥有它

我的问题是,当我尝试更新数据库中已有的慈善机构时,我不断收到一个指向$set的错误:

namespace :add_tw_handles_fields_2013_6_13 do

  desc "add_tw_handle"
  task :add_tw_handle => :environment do |t, args|
    # db.charity.update( { featured: false }, { $set: { tw_handle : "test"}}, false, true)

    # got your 6
   Charity.update({ },
      { 
        $set: { "tw_handle": "test"}
      },
      { multi: true }
    })

  end
end
我尝试了上面的2个synax调用,我正在阅读这2个文档

我总是会遇到以下错误:

add_tw_handles_fields_2013_6_13.rake:16: syntax error, unexpected ':', expecting tASSOC
        $set: { 
据我所知,这是正确的语法。我在脚本中运行这个,所以我认为我不需要数据库。在我的模型名之前(如未注释的更新中所示),对吗?我对这一点还不熟悉,但我确实复制并粘贴了示例,并填写了我的信息,什么都没有。然后,我尝试添加一个查询,但在它到达$set之前,从来没有出现过错误:我不知道为什么。正如上面链接的Mongo文档所示

如果您能了解我的问题,我们将不胜感激

谢谢


Alan

您收到的错误来自Ruby,而不是MongoDB,因为您试图在Ruby内部使用MongoDB的JSON语法,Ruby不喜欢这种语法。:)您的更新查询看起来不错,但您需要将其转换为Ruby语法,这有点不同

coll.update( { }, { "$set" => { "tw_handle" => "test" } } );
假设
coll
是您的收集对象,则该方法将起作用


有关使用Ruby驱动程序的良好教程(由MongoDB Ruby团队编写),请参阅。

您收到的错误来自Ruby,而不是MongoDB,因为您试图在Ruby内部使用MongoDB的JSON语法,Ruby不喜欢。:)您的更新查询看起来不错,但您需要将其转换为Ruby语法,这有点不同

coll.update( { }, { "$set" => { "tw_handle" => "test" } } );
假设
coll
是您的收集对象,则该方法将起作用


有关使用Ruby驱动程序的良好教程(由MongoDB Ruby团队编写),请参阅。

好的,在查看并与本项目的其他开发人员交谈后,我发现:

在rails脚本中,您希望通过rails而不是mongoDB直接访问对象:

以下示例用于从lib/tasks中运行脚本

使用Rails activerecord通过框架更新条目

m = ModelName.find("51b610972f52760fcc003331")

m.update_attributes( :attribute_name => "what you want to assign" )

m.save
在rails中查找具有模型给定id的对象(直接访问mongo db)

从控制台内部

在rails控制台中,您可以使用activerecord模型使用first segments语法来访问要查询的对象。但是如果您想直接进入mongo控制台,语法与上面的略有不同

转到项目的根目录后,在控制台中启动mongo,并根据其id从一个集合中查找对象:

>mongo
>show dbs
>use dbsname
>show collections

>db.collection_name.find({ _id: { $in: [ ObjectId("51b610972f52760fcc003331") ] }})

希望这有助于其他人的学习,因为每个语法单元都是不同的。我被告知mongo控制台使用javascript运行,rails控制台(以及项目内)使用activerecord运行调用,然后操纵MongoDB。上面的评论员只是在脚本中直接访问mongoDB。希望这篇文章能以不同的方式更加完整。

好的,在环顾四周并与本项目的其他开发人员交谈后,我发现:

在rails脚本中,您希望通过rails而不是mongoDB直接访问对象:

以下示例用于从lib/tasks中运行脚本

使用Rails activerecord通过框架更新条目

m = ModelName.find("51b610972f52760fcc003331")

m.update_attributes( :attribute_name => "what you want to assign" )

m.save
在rails中查找具有模型给定id的对象(直接访问mongo db)

从控制台内部

在rails控制台中,您可以使用activerecord模型使用first segments语法来访问要查询的对象。但是如果您想直接进入mongo控制台,语法与上面的略有不同

转到项目的根目录后,在控制台中启动mongo,并根据其id从一个集合中查找对象:

>mongo
>show dbs
>use dbsname
>show collections

>db.collection_name.find({ _id: { $in: [ ObjectId("51b610972f52760fcc003331") ] }})
希望这有助于其他人的学习,因为每个语法单元都是不同的。我被告知mongo控制台使用javascript运行,rails控制台(以及项目内)使用activerecord运行调用,然后操纵MongoDB。上面的评论员只是在脚本中直接访问mongoDB。因此,希望这是一个更完整的一点,在不同的方式,你可以遇到这个问题