1

Mongodb は、次のように列名の名前を変更するためのオプションを提供します

db.collection.update({},{'$rename'=> {'old_name' => 'new_name'}}, false,true)

MongoMapper を使用して同じことを行うことは可能ですか? ドキュメントには何も指定されていません。

また、MongoMapper から Mongodb 接続ハンドルを取得しようとしました。

connection = MongoMapper.connection 
db = MongoMapper.database
collection = db.collection('collection_name')
collection .update(....)

同じクエリを実行しますが、機能しません。

4

1 に答える 1

1

MongoMapper は第 10 世代の Ruby ドライバーを使用し、MongoMapper::Document は基礎となるドライバー オブジェクトへのアクセスを提供します。

次の作業テストは、Model.collection.update を使用して、モデル 'Model' のフィールドの名前を変更するために必要なことを実行できることを示しています。複数のドキュメントを更新/名前変更する場合は、必ず :multi => true オプションを使用して更新してください。

アプリ/モデル/model.rb

class Model
  include MongoMapper::Document
end

テスト/ユニット/モデル_test.rb

require 'test_helper'

class ModelTest < ActiveSupport::TestCase
  def setup
    Model.remove
  end

  test "rename" do
    puts "Model.collection.class: #{Model.collection.class}"
    puts "Model.database.class: #{Model.database.class}"
    Model.create( 'old_name' => 'name value 0', 'another_key' => 'another value 0' )
    Model.create( 'old_name' => 'name value 1', 'another_key' => 'another value 1' )
    assert_equal(2, Model.where( 'old_name' => { '$exists' => true } ).count)
    Model.collection.update( {}, { '$rename' => { 'old_name' => 'new_name' } }, :multi => true )
    assert_equal(0, Model.where( 'old_name' => { '$exists' => true } ).count)
    p Model.all
  end
end

$レーキテスト

Rack::File headers parameter replaces cache_control after Rack 1.5.
Run options: 

# Running tests:

Model.collection.class: Mongo::Collection
Model.database.class: Mongo::DB
[DEPRECATED] The 'safe' write concern option has been deprecated in favor of 'w'.
[#<Model _id: BSON::ObjectId('5101809d7f11ba1256000001'), another_key: "another value 0", new_name: "name value 0">, #<Model _id: BSON::ObjectId('5101809d7f11ba1256000002'), another_key: "another value 1", new_name: "name value 1">]
.

Finished tests in 0.012344s, 81.0110 tests/s, 162.0220 assertions/s.

1 tests, 2 assertions, 0 failures, 0 errors, 0 skips
于 2013-01-24T18:45:50.120 に答える