1

好的,这可能是一个愚蠢的问题,但我一直在阅读并尝试不同的查询,由于某种原因,我无法在不抛出错误的情况下让它工作。这是我第一次使用 MongoDB,它是在一个 RoR 项目中。我们成立慈善机构有一个推特句柄字段,但最初并没有放入模型中。所以我们用慈善机构填充了数据库,但现在它们都没有 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 个文档http://docs.mongodb.org/manual/reference/method/db.collection.update/ http://docs.mongodb.org/manual/core /update/#Updating-%24 位置操作符

我总是收到这个错误:

add_tw_handles_fields_2013_6_13.rake:16: syntax error, unexpected ':', expecting tASSOC
        $set: { 

据我所知,这是正确的语法。我在脚本中运行它,所以我认为我不需要数据库。在我的模型名称之前(如未注释的更新中所示)对吗?我对此并不陌生,但我确实复制并粘贴了示例并填写了我的信息,但什么也没有。然后我尝试添加一个查询,但在它到达 $set: 之前从来没有错误,我不知道为什么。它与上面链接的 Mongo 文档中显示的完全一样。

任何对我的问题的见解将不胜感激。

谢谢,

艾伦

4

2 回答 2

1

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

coll.update( { }, { "$set" => { "tw_handle" => "test" } } );

假设coll是您的 Collection 对象将起作用。

有关使用 Ruby 驱动程序的优秀教程(由 MongoDB Ruby 团队编写),请参见此处。

于 2013-06-18T18:14:40.840 回答
0

好的,所以在环顾四周并与该项目的其他开发人员交谈后,这就是我发现的:

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

object = ModelName.find({ 
  "$in" => { 
    "_id" =>  "51b610972f52760fcc003331"
  }
})

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

从控制台内

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

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

>mongo
>show dbs
>use dbsname
>show collections

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

希望这对其他刚刚学习的人有所帮助,每个语法都不同。有人告诉我 mongo 控制台使用 javascript 运行,其中 rails 控制台(以及项目内)使用 activerecord 来运行调用,然后操作 MongoDB。上面的评论者只是解决了直接从脚本中访问 mongoDB 的问题。因此,希望这在您遇到此问题的不同方式上更加完整。

于 2013-09-05T21:44:03.667 回答