Docs Menu
Docs Home
/ / /
Ruby MongoDB ドライバー
/

CRUD 操作

項目一覧

  • キーと値のペア表記
  • ドキュメントの作成
  • クエリ キャッシュ
  • 読み取り
  • 更新
  • 削除
  • 書込み保証 (write concern)
  • ドット/ピリオド(.)とドル記号($)を含むフィールド名
  • BSON シンボルの型に関する注意事項

CRUD 操作とは、ドキュメントの作成、読み取り、更新、削除を取り扱う操作です。

キーと値のペアは MongoDB Ruby ドライバーのさまざまなコンテキストで表示されますが、その表記方法に関する構文はいくつかあります。これは使用している Ruby のバージョンに応じて異なります。

ドキュメントを作成する場合、次の構文は Ruby バージョン 1.9 以降では受け入れ可能であり、正しいです。

document = { name: "Harriet", age: 36 }

Ruby バージョン 2.2 以降を使用している場合は、オプションで、キーを引用符で囲むことができます。

document = { "name": "Harriet", "age": 36 }

$set$gte$nearなど、 $で始まる MongoDB 演算子を使用する必要がある場合は、引用符で囲む必要があります。 Ruby バージョン 2.2 以降を使用している場合は、次のように表記できます。

collection.update_one({ name: "Harriet" }, { "$set": { age: 42 } })

Ruby の以前のバージョンを使用している場合は、ハッシュロケール記号を使用します。

collection.update_one({ name: "Harriet" }, { "$set" => { age: 42 } })

キーと値のペアの引用符された文字列とハッシュ値のペアは、次のどのバージョンの Ruby でも動作します。

collection.update_one({ "name" => "Harriet" }, { "$set" => { age: 42 } })

コレクションにドキュメントを挿入するには、クライアントでコレクションを選択し、 insert_oneまたはinsert_manyを呼び出します。

挿入操作は、挿入自体に関する情報を提供するMongo::Operation::Resultオブジェクトを返します。

MongoDB 2.6 以降では、挿入が失敗した場合、書込みコマンドが使用されるため、例外が発生します。

MongoDB 2.4では、挿入が失敗し、 書込み保証( write concern )が1以上の場合にのみ例外が発生します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
result = client[:artists].insert_one( { :name => 'FKA Twigs' } )
result.n # returns 1, because 1 document was inserted.
result = client[:artists].insert_many([
{ :name => 'Flying Lotus' },
{ :name => 'Aphex Twin' }
])
result.inserted_count # returns 2, because 2 documents were inserted.

バージョン 3.4 で追加

Decimal 128は、正確な精度で小数の丸めをエミュレートできる128ビットの 10 進数ベースの浮動小数点値を使用する BSON データ型です。 この機能は、財務や税金の計算など、金銭データを取り扱うアプリケーションを対象としています。

次の例では、 inventoryという名前のコレクションのpriceフィールドにDecimal128型の値を挿入します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')
price = BSON::Decimal128.new("428.79")
client[:inventory].insert_one({ "_id" => 1,
"item" => "26 inch monitor",
"price" => price })

上記の操作により、次のドキュメントが生成されます。

{ "_id" : 1, "item" : "26 inch monitor", "price" : NumberDecimal("428.79") }

Ruby BigDecimalオブジェクトから、またはDecimal128.from_string()を使用してDecimal128オブジェクトを作成することもできます。

big_decimal = BigDecimal.new(428.79, 5)
price = BSON::Decimal128.new(big_decimal)
# => BSON::Decimal128('428.79')
price = BSON::Decimal128.from_string("428.79")
# => BSON::Decimal128('428.79')

Ruby ドライバーはクエリ キャッシュを提供します。 有効にすると、クエリ キャッシュは検索クエリと集計クエリの結果を保存し、同じクエリが再度実行されたときに保存された結果を返します。

クエリ キャッシュの詳細については、クエリ キャッシュのチュートリアル を参照してください。

Ruby ドライバーは、コレクションでfindメソッドを使用するクエリ用のスムーズなインターフェースを提供します。 findメソッドではさまざまなオプションが利用できます。

クエリは、結果を反復処理するときにのみサーバーに対して遅延して実行されます。その時点でクエリはディスパッチされ、 Mongo::Cursorが返されます。

特定のフィルターのすべてのドキュメントを検索するには、次のクエリを指定してfindを呼び出します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').each do |document|
#=> Yields a BSON::Document.
end

ネストされたドキュメントをクエリするには、ドット表記を使用してネストされた順序でキーを指定します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find("records.releaseYear": 2008).each do |document|
#=> Yields a BSON::Document.
end

この使用は非推奨です。

findメソッドでは、最初のパラメータでレガシー$query構文を使用してクエリと オプションを提供できます。

collection.find(:'$query' => {name: 'Mr. Smith'})
# Equivalent to:
collection.find(name: 'Mr. Smith')
collection.find(:'$query' => {name: 'Mr. Smith'}, :'$sort' => {age: 1})
# Equivalent to:
collection.find(name: 'Mr. Smith').sort(age: 1)

MongoDB 3.2 以降に対してクエリが実行されると、ドライバーは対象のサーバーバージョンに適したプロトコルを使用し、必要に応じてクエリを find コマンドまたは OP_MSG ペイロードのいずれかに自動的に変換します。

クエリにオプションを追加するには、 findメソッドの後に適切なメソッドを連鎖させます。 基礎となるオブジェクトであるMongo::Collection::Viewは不変であり、メソッドを呼び出すごとに新しいオブジェクトが返されることに注意してください。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
documents = client[:artists].find(:name => 'Flying Lotus').skip(10).limit(10)
documents.each do |document|
#=> Yields a BSON::Document.
end

以下は、クエリ時に追加できるオプションとそれに対応するメソッドの完全なリストです。

オプション
説明

allow_disk_use

true に設定されている場合、サーバーは検索操作の実行中に一時データをディスクに書込むことができます。 このオプションは、MongoDB サーバー バージョン 4.4 以降でのみ使用できます。

allow_partial_results

シャーディングされたクラスターで使用します。 シャードがダウンしている場合、クエリが稼働中のシャードから結果を返すことができます。これにより、結果の一部だけが取得される可能性があります。

batch_size(Integer)

GETMORE操作ごとにカーソルが返すドキュメントの各バッチのサイズを指定します。

comment(String)

クエリにコメントを追加します。

explain(**opts)

クエリのクエリプランを返します。 シンボルキーを使用して、キーワード引数を介して説明オプションを渡します。

# All server versions - default explain behavior
client[:artists].find.explain
# MongoDB 3.0 and newer
client[:artists].find.explain(verbosity: :query_planner)
client[:artists].find.explain(verbosity: :execution_stats)
client[:artists].find.explain(verbosity: :all_plans_execution)
# Alternative syntax using camel case
client[:artists].find.explain(verbosity: "queryPlanner")
client[:artists].find.explain(verbosity: "executionStats")
client[:artists].find.explain(verbosity: "allPlansExecution")
# MongoDB 2.6
client[:artists].find.explain(verbose: true)

説明操作では、 :session:read (読み込み設定(read preference)のオプションをサポートしています。 1 回の explain 操作でこれらのオプションを指定するには、次のようにfindメソッドに指定する必要があります。

client[:artists].find({}, session: session).explain
client[:artists].find({}, read: {mode: :secondary_preferred}).explain

読み込み設定(read preference)オプションがクライアントまたは コレクションで指定されている場合、それは explain 操作に渡されます。

client[:artists, read: {mode: :secondary_preferred}].find.explain

コレクション オブジェクトの作成時には、セッション オプションは受け入れられないことに注意してください。

explain コマンドは、読み取り保証 (read concern) オプションを渡すことをサポートしていません。 読み取り保証 (read concern) がクライアント レベルまたはコレクション レベルで指定されている場合、または読み取り保証 (read concern) が find オプションとして指定されている場合、ドライバーによって explain コマンドに渡されることはありません。

explainコマンドに対してサーバーが返す情報は、サーバーのバージョンと配置のトポロジーによって異なります。 ドライバーのexplainメソッドは、サーバーが提供したものを返します。

``explain`` メソッドの戻り値は、ドライバーの公開APIの一部ではなく、サーバーのバージョンと配置のトポロジーによって異なります。

hint(Hash)

使用するインデックス ヒントを含むクエリを提供します。

let(Hash)

クエリで使用する変数のマッピング。

limit(Integer)

返されたドキュメントの数を指定された値に制限します。

max_scan(Integer)

フル コレクションスキャンを実行する場合にスキャンするドキュメントの最大数を設定します。 MongoDB サーバー バージョン 4.0 以降で非推奨になりました。

max_time_ms(Integer)

クエリの実行を許可する最大時間(ミリ秒単位)。

no_cursor_timeout

MongoDB は 10 分間の期間後に非アクティブなカーソルを自動的に閉じます。 サーバー上でカーソルが無期限に開いたままになるようにするには、これを呼び出します。

projection(Hash)

結果に含めるフィールド、または結果から除外するフィールドを指定します。

client[:artists].find.projection(:name => 1)

read(Hash)

このクエリのみの読み込み設定 (read preference) を変更します。

client[:artists].find.read(:mode => :secondary_preferred)

session(Session)

使用するセッション。

show_disk_loc(Boolean)

ディスク上のドキュメントの場所も結果に含めるように指示します。

skip(Integer)

結果内の指定された数のドキュメントをスキップします。

snapshot

クエリをスナップショット モードで実行します。 MongoDB サーバー バージョン 4.0 以降で非推奨になりました。

sort(Hash)

クエリのソート条件を指定します。

client[:artists].find.sort(:name => -1)
count_documents
フィルターに一致するドキュメントの合計数、またはコレクション内のドキュメントの合計数を取得します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').count_documents
estimated_document_count

コレクション内のドキュメントのおおよその数を取得します。

count_documentsと違い、 estimated_document_countはフィルターを受け入れていないことに注意してください。

estimated_document_countの実装にはcountサーバーコマンドが使用されます。 詳細については、 「 カウント:動作」を参照してください。

MongoDB バージョン 5.0.0~5.0.7 のオーバービューにより、 estimated_document_countが実装で使用するcountコマンドは、Stable API の v1 に含まれていませんでした。 したがって、エラーが発生しないように、サーバーStable API estimated_document_countバージョンを 以上にアップグレードするか、api_strict: false を設定することをお勧めします。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].estimated_document_count
count

フィルターに一致するドキュメントのおおよその数、またはコレクション内のドキュメントのおおよその数を取得します。

推奨: countメソッドは非推奨であり、トランザクションでは機能しません。 フィルターに一致する可能性のあるドキュメントの正確な数を取得するにはcount_documentsを使用し、コレクション内のドキュメントのおおよその数を取得するにはestimated_document_countを使用してください。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').count
distinct
値が重複するドキュメントをフィルタリングで除外します。 SQL distinct句と同等です。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find.distinct(:name )

Capped コレクションの場合、クライアントが初期カーソルの結果を使い果たした後も開いたままになる 追尾可能(tailable) カーソルを使用できます。 次のコード例は、追尾可能 (tailable) カーソルの使用方法を示しています。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].drop
client[:artists, capped: true, size: 512].create
result = client[:artists].insert_many([
{ :name => 'Flying Lotus' },
{ :name => 'Aphex Twin' }
])
enum = client[:artists].find({}, cursor_type: :tailable_await).to_enum
while true
doc = enum.next
# do something
sleep(1)
end

読み取り保証 (read concern) は、クライアントまたは コレクションに設定できます。

client = Mongo::Client.new(['localhost:14420'], database: 'music',
read_concern: {level: :local})
client['collection'].find.to_a
collection = client['collection', read_concern: {level: :majority}]
collection.find.to_a

ドライバーは現在、個々のクエリでの読み取り保証の設定をサポートしていません。

読み取り保証 (read concern) は、 トランザクションを開始するときに指定できます。 トランザクションがアクティブな場合、クライアントまたは コレクションに指定された読み取り保証は無視されます。

汎用コマンド ヘルパーを使用する場合、 コマンドの一部として読み取り保証(read concern)を指定できます。

client.database.command(dbStats: 1, readConcern: {level: :majority})

読み込み設定 (read preference) によって、クエリまたはコマンドを送信できる候補レプリカセットノードが決まります。 シンボルとして指定されるモードtags_setsと呼ばれるハッシュの配列、ヘッジされた読み取り動作を指定するハッシュであるhedgeオプション、および 2 つのタイミング オプション、 local_thresholdserver_Selection_timeoutで構成されています。

local_threshold
操作が送信される可能性のある最も近いサーバーと適切なサーバーとの間のレイテンシ ウィンドウの上限を秒単位で定義します。 デフォルトは 15 ミリ秒、つまり 0.015 秒です。
server_selection_timeout
例外をスローする前に、サーバー選択のために他の処理をブロックする期間を定義します。 デフォルトは 30,000 ミリ秒、つまり 30 秒です。

注意

読み込み設定 (read preference) は、スタンドアロン配置には適用されません。 クライアントがスタンドアロン配置に接続されている場合、アプリケーションが指定した読み込み設定 (read preference) は無視されます。

サーバーを選択するために使用されるアルゴリズムの詳細については 、 で利用可能なサーバー選択のドキュメントGithub を参照してください。 。

読み込み設定(read preference)は、クライアント上のオプションとして設定することも、データベースでコマンドを実行するときにオプションを渡すこともできます。

# Set read preference on a client, used for all operations
client = Mongo::Client.new([ '127.0.0.1:27017' ],
read: { mode: :secondary,
tag_sets: [ { 'dc' => 'nyc' } ]
} )
# Set read preference for a given command
client.database.command( { dbStats: 1 }, read: { mode: secondary,
tag_sets: [ { 'dc' => 'nyc' } ] } )

withメソッドを使用して、コレクションに対する特定の操作に読み込み設定(read preference)を設定することもできます。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.with(:read => { :mode => :primary_preferred }).find.to_a

読み込み設定 (read preference) モードとして、 :primary:secondary:primary_preferred:secondary_preferred 、``:nearest`` の 5 つがあります。 モードの説明については、MongoDB マニュアルの 読み込み設定 (read preference) のドキュメントを参照してください。

注意

クライアントが:direct_connection Ruby オプションまたはdirectConnection URI オプションを使用してサーバーに直接接続されている場合、読み込み設定(read preference)モードは自動的に:primary_preferredに設定され、セカンダリに対する読み取り操作が許可されます。 アプリケーションで:primary読み込み設定(read preference)モードが指定されている場合、このモードは自動的に:primary_preferredに変換されます。 別の読み込み設定(read preference)モードが指定されている場合は、それは変更されずにサーバーに渡されます。

tag_setsパラメータは、データセンターの認識など、選択対象のサーバーの資格を制限するために使用されるタグセットの順序付きリストです。 タグセットの説明については、MongoDB マニュアルの 読み込み設定 (read preference) のドキュメントを参照してください。

読み込み設定(read preference)タグセット(T)は、サーバー タグセット(S)と一致します。または、サーバー タグセット(S)は読み込み設定(read preference)タグセット(T)と一致します(T が S のサブセットの場合)。

たとえば、読み込み設定(read preference)タグセット{ dc: 'ny', rack: 2 }は、タグセット{ dc: 'ny', rack: 2, size: 'large' }を持つセカンダリ サーバーと一致します。

空のドキュメントである タグセット は任意のサーバーに一致します。空のタグセットは任意のタグセットのサブセットであるためです。 つまり、デフォルトのtag_setsパラメータ[{}]はすべてのサーバーと一致します。

hedgeパラメータは、サーバーがヘッジされた読み取りを使用するかどうかを指定するハッシュです。 ヘッジされた読み取りを使用すると、シャーディングされたクラスターは読み取り操作を 2 つのレプリカセット ノードにルーティングして、最初の応答から結果を返すことができます。

hedgeオプションは、非プライマリ読み込み設定(read preference)でのみ指定できます。 キーenabledtrueまたはfalseに設定されているハッシュとして提供する必要があります。

client = Mongo::Client.new(
[ '127.0.0.1:27017' ],
read: { mode: :secondary, hedge: { enabled: true } },
)

ヘッジされた読み取り の詳細については、 MongoDB マニュアルを参照してください。

注意

hedgeオプションは MongoDB サーバー バージョン 4.4 以降でのみ使用できます。 古いバージョンのサーバーでこのオプションを使用しようとすると、エラーが発生します。

ドキュメントを更新するには、単一または複数の更新を実行するか、 $findAndModifyコマンドを使用します。

update_one

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
result = artists.find(:name => 'Goldie').update_one("$inc" => { :plays => 1 } )
result.n # Returns 1.
result = artists.update_one( { :name => 'Goldie' }, { "$inc" => { :plays => 1 } } )
result.n # Returns 1.

update_many

result = artists.find(:label => 'Hospital').update_many( "$inc" => { :plays => 1 } )
result.modified_count # Returns the number of documents that were updated.
result = artists.update_many( { :label => 'Hospital' }, { "$inc" => { :plays => 1 } } )
result.modified_count # Returns the number of documents that were updated.

replace_one

result = artists.find(:name => 'Aphex Twin').replace_one(:name => 'Richard James')
result.modified_count # Returns 1.
result = artists.replace_one( { :name => 'Aphex Twin' }, { :name => 'Richard James' } )
result.modified_count # Returns 1.

$findAndModify経由でドキュメントを更新し、ドキュメントを返すには、提供されている 3 つのヘルパーのいずれかを使用します: find_one_and_deletefind_one_and_replace 、またはfind_one_and_update 。 変更が行われる前または後にドキュメントを返すことも選択できます。

find_one_and_delete

client = Mongo::Client.new( [ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.find(:name => 'José James').find_one_and_delete # Returns the document.

find_one_and_replace

doc = artists.find(:name => 'José James').find_one_and_replace(:name => 'José')
doc # Return the document before the update.
doc = artists.find_one_and_replace({ :name => 'José James' }, { :name => 'José' })
doc # Return the document before the update.
doc = artists.find(:name => 'José James').
find_one_and_replace( { :name => 'José' }, :return_document => :after )
doc # Return the document after the update.

find_one_and_update

doc = artists.find(:name => 'José James').
find_one_and_update( '$set' => { :name => 'José' } )
doc # Return the document before the update.
doc = artists.find_one_and_update( { :name => 'José James' }, { '$set' => { :name => 'José' } } )
doc # Return the document before the update.

アップデート コマンドにオプションを追加するには、オプション ハッシュ引数でキーと値のペアとして指定します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.indexes.create_one(name: 1)
# Force the server to use the name index to perform this operation
result = artists.update_one(
{ :name => 'Goldie' },
{ "$inc" => { :plays => 1 } },
{ hint: { name: 1 } }
)
result.n # Returns 1.

次は、更新操作に追加できるオプションのリストですupdate_oneupdate_manyreplace_onefind_one_and_deletefind_one_and_updatefind_one_and_replaceなど。

オプション
説明

array_filters

配列フィールドの更新操作でどの配列要素を変更するかを決定するフィルター ドキュメントの配列。

bypass_document_validation

ドキュメントを書き込む前にドキュメントレベルの検証をスキップするかどうか。

collation

特定の言語の規則に従って文字列を比較するときに使用するルールのセットを指定します。

hint

この操作に使用するインデックス。 ハッシュ(例: { _id: 1 })または string として(例: "_id_")。 MongoDB サーバー バージョン 4.2update_one update_manyreplace_onefind_one_and_delete以降では、 、 コマンド、 コマンドと、サーバー バージョン 4.4find_one_and_update 以降でfind_one_and_replace コマンド、 コマンド、および コマンドがサポートされています。

let(Hash)

この操作に使用する変数のマッピング。

projection

操作結果に除外するフィールド、または含めるフィールド( find_one_and_deletefind_one_and_replace 、およびfind_one_and_updateコマンドでのみ使用可能)。

return_document

更新されたドキュメントを更新前または更新後に返すかを指定する記号。 潜在的な値は:beforeまたは:afterです。 ( find_one_and_updatefind_one_and_replaceコマンドでのみ使用可能)。

sort

find および コマンドの結果をソートする方法。 ハッシュされたキーと値のペアとして指定されます。キーは並べ替えるフィールドの名前で、値は 1 または -1 のいずれかで、昇順または降順での並べ替えを指定します( find_one_and_deletefind_one_and_replaceでのみ利用可能) 、およびfind_one_and_updateコマンド)

session

この操作に使用するセッション。

upsert

ドキュメントが存在しない場合にアップサートを実行するかどうか。 find_one_and_delete操作では使用できません。

更新オプションの詳細については、次のコマンドに関する MongoDB サーバーのドキュメントを参照してください。

  • update

  • findAndModify

delete_one

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
result = artists.find(:name => 'Björk').delete_one
result.deleted_count # Returns 1.
result = artists.delete_one(:name => 'Björk')
result.deleted_count # Returns 1.

delete_many

result = artists.find(:label => 'Mute').delete_many
result.deleted_count # Returns the number deleted.
result = artists.delete_many(:label => 'Mute')
result.deleted_count # Returns the number deleted.

削除コマンドにオプションを追加するには、オプション ハッシュ引数でキーと値のペアとして指定します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.indexes.create_one(name: 1)
# Force the server to use the name index to perform this operation
result = artists.find(:name => 'Björk').delete_one(hint: { name: 1 })
result.deleted_count # Returns 1.

以下は、 delete_onedelete_manyの操作に追加できる利用可能なオプションの完全なリストです。

オプション
説明

collation

特定の言語の規則に従って文字列を比較するときに使用するルールのセットを指定します。

hint

この操作に使用するインデックス。 ハッシュ(例: { _id: 1 })または string として(例: "_id_")。 MongoDB サーバー バージョン 4.4 以降でサポートされています。

let(Hash)

この操作に使用する変数のマッピング。

session

この操作に使用するセッション。

更新オプションの詳細については、 delete コマンドに関する MongoDB サーバーのドキュメントを参照してください。

MongoDB のすべての書込み (write) 操作は、特定の書込み (write) に対して MongoDB から要求される確認応答のレベルである 書込み保証 (write concern) を使用して実行されます。 一般的な書込み保証 (write concern) の詳細については、 MongoDB マニュアルを参照してください。

Ruby ドライバーは、クライアント、コレクション、セッション(そのセッション上のトランザクション)、トランザクション、GridFS バケット、書込みストリーム レベルに関する書込み保証 (write concern) の指定と、 Database#command経由で コマンドを手動で発行する場合をサポートしています。

ドライバー バージョン 2.10 以降では、書込み保証 (write concern) を受け入れるすべてのドライバー オブジェクトは:write_concernオプションを通じてこれを行います。これは、書込み保証 (write concern) オプションでハッシュを提供する必要があります。 :writeオプションの使用は非推奨です。 ドライバー バージョン 2.9 以前では、クライアント、コレクション、GridFS オブジェクトは:write_concernオプションを使用するセッションとトランザクション オブジェクトとともに、 :writeオプションで 書込み保証(write concern) オプションを選択していました。

以下は、クライアントとコレクション オブジェクトに書込み保証 (write concern) を渡す例えです。 :write_concernオプションは、新しいクライアントとコレクション オブジェクトを作成するとき、または#withメソッドに提供できます。

GridFS の例はGridFSページに記載されています。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
alt_client = client.with(write_concern: {w: :majority})
collection = client[:artists, write_concern: {w: 3}]
alt_collection = collection.with(write_concern: {w: :majority})
# Uses w: 3
collection.insert_one({name: 'SUN Project'})
# Uses w: :majority
alt_collection.insert_one({name: 'SUN Project'})

ドライバー バージョン 2.9 以前では、 :writeオプションを使用してクライアントとコレクション レベルで書込み保証 (write concern) を受け入れていました。 この使用は下位互換性のために引き続きサポートされますが、非推奨です。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write: {w: 2})
alt_client = client.with(write: {w: :majority})
collection = client[:artists, write: {w: 3}]
alt_collection = collection.with(write: {w: :majority})

:write:write_concernオプションの両方が指定されている場合、その値は同じである必要があります。そうでない場合は例外が発生します。

# OK
client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 3}, write: {w: 3})
# Error
client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 3}, write: {w: :majority})

#withメソッドがクライアントまたはコレクションのオプションを変更するために使用される場合、名前が異なる場合は、最後に指定されたオプションが優先されます。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
alt_client = client.with(write: {w: 3})
alt_client.options[:write]
# => {"w"=>3}
alt_client.options[:write_concern]
# => nil

トランザクションを使用する場合、書込み保証 (write concern)commit_transactionabort_transaction トランザクションの仕様 ごとに と の操作でのみサーバーに送信されます。 。書込み保証(write concern)は、 with_transactionまたはstart_transaction呼び出しの:write_concernオプション、またはセッション オブジェクトのdefault_transaction_optionsオプションを介して設定できます。 これらのいずれも設定されていない場合は、クライアントの書込み保証が使用されます。トランザクションは、操作に関係するコレクションの書込み保証を無視することに注意してください。 書込み保証をトランザクション オプションとして設定する場合、 :writeオプションはどのドライバー バージョンでも認識されないことに注意してください。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
collection = client[:artists, write_concern: {w: :majority}]
session = client.start_session
session.with_transaction do
collection.insert_one({test: 1}, session: session)
# Uses w: 2 when committing
end
session = client.start_session(default_transaction_options:
{write_concern: {w: 3})
)
session.with_transaction do
collection.insert_one({test: 1}, session: session)
# Uses w: 3 when committing
end
session = client.start_session
session.with_transaction(write_concern: {w: 3}) do
collection.insert_one({test: 1}, session: session)
# Uses w: 3 when committing
end

書込み保証が継承される場合、継承は個々の要素ではなく書込み保証のハッシュ全体に適用されます。 たとえば次の場合は、 j: trueは継承されません。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 1, j: true})
collection = client[:artists, write_concern: {w: 2}]
collection.write_concern.options
# => #<Mongo::WriteConcern::Acknowledged:0x47289650367880 options={:w=>2}>

CRUD 操作はオプション ハッシュを受け入れますが、現在は:write_concernオプションを認識していません。

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
collection = client[:artists, write_concern: {w: :majority}]
# Still uses w: :majority
collection.insert_one({name: 'SUN Project'}, write_concern: {w: 1})

これの最も簡単な回避策は、 #withを使用して、目的の書込み保証(write concern)を持つ新しいコレクション インスタンスを取得することです。

# Uses w: 1
collection.with(write_concern: {w: 1}).insert_one(name: 'SUN Project')

書込み保証 (write concern) は、 Database#commandで手動で指定することもできます。

client.database.command(create: 'foo-collection', writeConcern: {w: :majority})

ここでの writeConcern は、オプションではなく操作の一部であり、構文は Ruby ドライバーが使用するアンダースコアではなく、MongoDB サーバーが認識するキャメルケースであることに注意してください。

mongo Rubyドライバー バージョン 2.18.0 以降では、ドル記号($)で始まるフィールドと、その中にドット/ピリオド(.)が含まれるフィールドを操作する機能が利用できます。 ドライバー バージョン2.17.0以前では、ドット付きフィールドまたはドル記号 フィールドを操作しようとするとIllegalKeyエラーが発生します。 これらのタイプのフィールドの操作の詳細については、「 ピリオド(.)」およびドル記号($)を含むフィールド名 に関する の を参照してください。MongoDBDocs

BSON 仕様によって BSON シンボルタイプが非推奨になったため、 bson gem は単独で使用すると Ruby シンボルを BSON string に直列化します。 ただし、古いデータセットとの下位互換性を維持するために、Ruby ドライバーはこの動作をオーバーライドして、Ruby シンボルを BSON シンボルとして直列化します。 これは、フィールドとして BSON シンボルを含むドキュメントのクエリを指定できるようにするために必要です。 ただし、シンボル タイプ フィールドを持つ新しいドキュメントは データベースに保存しないでください。代わりに、string フィールドを使用してください。

デフォルトの動作をオーバーライドし、シンボル値を string としてエンコードするようにドライバーを構成するには、次のコード スニペットをプロジェクトに含めます。

class Symbol
def bson_type
BSON::String::BSON_TYPE
end
end

戻る

データの操作