Ruby連線MongoDB操作


MongoDB Ruby驅動程式是MongoDB官方支援的Ruby驅動程式。它是用純Ruby編寫的,為了簡化而進行了優化。它可以自己使用,但它也可以作為幾個物件對映庫的基礎。

1.安裝驅動程式

Ruby驅動程式是作為一個gem係結的,並且託管在Rubygems上。

安裝gem

驅動程式可以手動或捆綁式安裝。手動安裝gem

gem install mongo

要使用綑綁安裝gem,請在Gemfile中包含以下內容:

gem 'mongo', '~> 2.4'

2.前提條件

  • MongoDB範例在localhost上執行使用預設埠27017
  • Ruby MongoDB驅動程式。有關如何安裝MongoDB驅動程式的說明,請參閱安裝。
  • 程式碼頂部的以下語句:
require 'mongo'

3.Ruby連線MongoDB

使用Mongo::Client建立與正在執行的MongoDB範例的連線。

require 'mongo'
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')

還可以使用URI連線字串:

require 'mongo'
client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')

4.存取資料庫和集合

以下範例演示如何存取指定資料庫並顯示其集合:

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')
db = client.database

db.collections # returns a list of collection objects
db.collection_names # returns a list of collection names

要存取一個集合,請按名稱檢視。

collection = client[:restaurants]

如果集合不存在,伺服器將在第一次放入資料時建立。

插入文件

要將單個文件插入到集合中,請使用insert_one方法。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')

collection = client[:people]

doc = { name: 'Steve', hobbies: [ 'hiking', 'tennis', 'fly fishing' ] }

result = collection.insert_one(doc)
result.n # returns 1, because one document was inserted

要將多個文件插入到集合中,請使用insert_many方法。

docs = [ { _id: 1, name: 'Steve', hobbies: [ 'hiking', 'tennis', 'fly fishing' ] },
         { _id: 2, name: 'Sally', hobbies: ['skiing', 'stamp collecting' ] } ]

result = collection.insert_many(docs)
result.inserted_count # returns 2 because two documents were inserted

查詢集合

使用find方法查詢集合。一個空的查詢過濾器返回集合中的所有文件。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

collection.find.each do |document|
  #=> Yields a BSON::Document.
end

使用查詢過濾器只找到匹配的文件。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

puts collection.find( { name: 'Sally' } ).first

該範例應該會列印以下內容:

{"_id" => 2, "name" => "Sally", "hobbies" => ["skiing", "stamp collecting"]}

更新檔案

有幾種更新方法,包括:update_oneupdate_manyupdate_one更新單個文件,而update_many會一次更新多個文件。

這兩種方法都將查詢過濾器作為第一個引數,以及更新文件的資料作為第二個引數。 使用$set來新增或更新特定的欄位。如果沒有$set,則會將所有文件更新為給定的更新資料。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

result = collection.update_one( { 'name' => 'Sally' }, { '$set' => { 'phone_number' => "555-555-5555" } } )

puts collection.find( { 'name' => 'Sally' } ).first

刪除文件

使用delete_onedelete_many方法從集合中刪除文件(單個或多個)。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

result = collection.delete_one( { name: 'Steve' } )

puts result.deleted_count # returns 1 because one document was deleted

以下範例將兩個記錄插入到集合中,然後使用與正規表示式匹配name欄位查詢,刪除那些以「S」開頭的字串的所有文件。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

collection.insert_many([ { _id: 3, name: "Arnold" }, { _id: 4, name: "Susan" } ])

puts collection.count # counts all documents in collection

result = collection.delete_many({ name: /$S*/ })

puts result.deleted_count # returns the number of documents deleted

建立索引

使用create_onecreate_many方法一次建立一個索引或多個索引。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

collection.indexes.create_one({ name: 1 }, unique: true)

使用create_many方法使用一個語句建立多個索引。 請注意,使用create_many時,語法與create_one不同。

client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')
collection = client[:people]

collection.indexes.create_many([
    { key: { name: 1 } , unique: true },
    { key:  { hobbies: 1 } },
  ])