1

わかりました、これはおそらくばかげた質問ですが、さまざまなクエリを読んで試してみましたが、何らかの理由でエラーをスローせずにこれを機能させることができません。MongoDB を使用するのはこれが初めてで、RoR プロジェクトに参加しています。慈善団体に twitter ハンドル フィールドを設定しましたが、もともとモデルには含まれていませんでした。そのため、DB に慈善団体を追加しましたが、今ではどれも twitter ハンドル フィールドを持っていません。私はそれをモデルに追加したので、作成された他のすべてがそれを持っています。

私の問題は、DB に既にある慈善団体を更新しようとすると、$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-The%24positionaloperator .

私はいつもこのエラーを受け取ります:

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

私が知る限り、それは正しい構文です。これをスクリプトで実行しているので、データベースは必要ないと思います。私のモデル名の前(コメントされていない更新に示されているように)ですよね?私はこれに慣れていませんが、例を文字通りコピーして貼り付け、情報を入力しましたが、何も入力しませんでした。次に、クエリを追加しようとしましたが、 $set: に到達するまでエラーは発生しません。理由はわかりません。上記のMongoドキュメントに示されているとおりです。

私の問題についての洞察は大歓迎です。

ありがとう、

アラン

4

2 に答える 2

1

発生しているエラーは、MongoDB ではなく Ruby からのものです。これは、Ruby が気に入らない Ruby 内で MongoDB の JSON 構文を使用しようとしているためです。:) 更新クエリは問題ないように見えますが、少し異なる Ruby 構文に変換する必要があります。

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

collあなたのコレクションオブジェクトであると仮定して動作します。

Ruby ドライバーの使用に関する優れたチュートリアル (MongoDB Ruby チームによって作成された) については、こちらを参照してください。

于 2013-06-18T18:14:40.840 に答える
0

わかりましたので、このプロジェクトの他の開発者と周りを見回して話し合った後、これが私が見つけたものです:

Rails スクリプト内で、直接 mongoDB ではなく、Rails を介してオブジェクトにアクセスする必要があります。

次の例は、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 に基づいてコレクションの 1 つからオブジェクトを見つけます。

>mongo
>show dbs
>use dbsname
>show collections

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

構文はそれぞれで異なります。Railsコンソール(およびプロジェクト内)がactiverecordを使用して呼び出しを実行し、MongoDBを操作している場合、mongoコンソールはjavascriptで実行されると言われました。上記のコメント投稿者は、スクリプト内から直接 mongoDB にアクセスすることのみに対処していました。したがって、この問題に遭遇する可能性のあるさまざまな方法で、これがもう少し完全であることを願っています.

于 2013-09-05T21:44:03.667 に答える