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_one
和update_many
。 update_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_one
或delete_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_one
或create_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 } },
])