<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # MongoDB Ruby 教程 > 原文: [http://zetcode.com/db/mongodbruby/](http://zetcode.com/db/mongodbruby/) 在本教程中,我們展示了如何在 Ruby 中使用 MongoDB。 在 ZetCode 上有一個簡潔的 [Ruby 教程](/lang/rubytutorial/)。 [Tweet](https://twitter.com/share) MongoDB 是 NoSQL 跨平臺的面向文檔的數據庫。 它是可用的最受歡迎的數據庫之一。 MongoDB 由 MongoDB Inc.開發,并作為免費和開源軟件發布。 MongoDB 中的記錄是一個文檔,它是由字段和值對組成的數據結構。 MongoDB 文檔與 JSON 對象相似。 字段的值可以包括其他文檔,數組和文檔數組。 MongoDB 將文檔存儲在集合中。 集合類似于關系數據庫中的表以及行中的文檔。 ## 安裝 MongoDB 以下命令可用于在基于 Debian 的 Linux 上安裝 MongoDB。 ```ruby $ sudo apt-get install mongodb ``` 該命令將安裝 MongoDB 隨附的必要包。 ```ruby $ sudo service mongodb status mongodb start/running, process 975 ``` 使用`sudo service mongodb status`命令,我們檢查`mongodb`服務器的狀態。 ```ruby $ sudo service mongodb start mongodb start/running, process 6448 ``` `mongodb`服務器由`sudo service mongodb start`命令啟動。 ```ruby $ sudo gem install mongo ``` MongoDB Ruby 驅動程序通過`sudo gem install mongo`命令安裝。 ## 建立數據庫 `mongo`工具是 MongoDB 的交互式 JavaScript Shell 界面,它為系統管理員提供了一個界面,并為開發者提供了一種直接測試數據庫查詢和操作的方法。 ```ruby $ mongo testdb MongoDB shell version: 2.4.9 connecting to: testdb > db testdb > db.cars.insert({name: "Audi", price: 52642}) > db.cars.insert({name: "Mercedes", price: 57127}) > db.cars.insert({name: "Skoda", price: 9000}) > db.cars.insert({name: "Volvo", price: 29000}) > db.cars.insert({name: "Bentley", price: 350000}) > db.cars.insert({name: "Citroen", price: 21000}) > db.cars.insert({name: "Hummer", price: 41400}) > db.cars.insert({name: "Volkswagen", price: 21600}) ``` 我們創建一個`testdb`數據庫,并在`cars`集合中插入八個文檔。 ## 列出數據庫集合 在數據庫中`Mongo::Client`的`collections`方法列出可用的集合。 `list_collections.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client.collections.each { |coll| puts coll.name } `client.close` ``` 該示例連接到`testdb`數據庫并檢索其所有集合。 ```ruby require 'mongo' ``` 我們包含`mongo`驅動程序。 ```ruby Mongo::Logger.logger.level = ::Logger::FATAL ``` 默認日志記錄級別為`::Logger::DEBUG`,其中包含許多調試信息。 為了使輸出更具可讀性,我們選擇`::Logger::FATAL`調試級別。 ```ruby client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') ``` `Mongo::Client`用于連接到 MongoDB 服務器。 我們指定 URL 和數據庫名稱。 27017 是 MongoDB 服務器監聽的默認端口。 ```ruby client.collections.each { |coll| puts coll.name } ``` 我們遍歷集合列表,并將其名稱打印到控制臺。 ```ruby `client.close` ``` 最后,我們關閉連接。 通常,不建議應用調用`close`。 連接很昂貴,正在重用。 但是,由于它是一個一次性程序,而不是長時間運行的可重用連接的應用,因此我們確實調用了該方法。 ```ruby $ ./list_collections.rb test cars ``` 這是`list_collections.rb`程序的示例輸出。 ## 服務器選擇超時 `:server_selection_timeout`是選擇操作服務器的超時時間(以秒為單位)。 當我們無法連接到數據庫服務器時,將引發`Mongo::Error::NoServerAvailable`。 `server_selection_timeout.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::DEBUG begin client = Mongo::Client.new([ '127.0.0.1:2717' ], :database => "testdb", :server_selection_timeout => 5) client[:cars].find.each { |doc| puts doc } client.close rescue Mongo::Error::NoServerAvailable => e p "Cannot connect to the server" p e end ``` 該示例的端口號錯誤。 默認情況下,服務器選擇超時為三十秒。 我們將其設置為五秒鐘。 ```ruby rescue Mongo::Error::NoServerAvailable => e ``` 未建立連接且超時已過期時,拋出`Mongo::Error::NoServerAvailable`。 ```ruby $ ./server_selection_timeout.rb D, [2016-05-02T15:32:20.231750 #8070] DEBUG -- : MONGODB | Adding 127.0.0.1:2717 to the cluster. D, [2016-05-02T15:32:20.232486 #8070] DEBUG -- : MONGODB | Connection refused - connect(2) D, [2016-05-02T15:32:20.732627 #8070] DEBUG -- : MONGODB | Connection refused - connect(2) D, [2016-05-02T15:32:21.232724 #8070] DEBUG -- : MONGODB | Connection refused - connect(2) ... ``` 調試日志記錄級別在嘗試連接到服務器時會提供這些消息。 ## 數據庫統計 `dbstats`命令獲取數據庫的統計信息。 `dbstats.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ]) db = client.use("testdb") db.command({"dbstats" => 1}).documents[0].each do |key, value| puts "#{key}: #{value}" end `client.close` ``` 該示例連接到`testdb`數據庫并顯示其統計信息。 數據庫對象的`command`方法用于執行命令。 ```ruby db = client.use("testdb") ``` `use`方法選擇`testdb`數據庫。 ```ruby db.command({"dbstats" => 1}).documents[0].each do |key, value| puts "#{key}: #{value}" end ``` `command`方法執行`dbstats`命令并解析返回的哈希值。 ```ruby $ ./dbstats.rb db: testdb collections: 4 objects: 21 avgObjSize: 43.23809523809524 dataSize: 908 storageSize: 16384 numExtents: 4 indexes: 2 indexSize: 16352 fileSize: 201326592 nsSizeMB: 16 dataFileVersion: {"major"=>4, "minor"=>5} ok: 1.0 ``` 這是`dbstats.rb`程序的輸出。 ## 讀取數據 `find`方法在集合中查找文檔。 `read_all.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client[:cars].find.each { |doc| puts doc } `client.close` ``` 在示例中,我們遍歷`cars`集合的所有數據。 ```ruby client[:cars].find.each { |doc| puts doc } ``` 傳遞空查詢將返回所有文檔。 我們使用`each`方法遍歷`:cars`集合的文檔。 ```ruby $ ./read_all.rb {"_id"=>1, "name"=>"Audi", "price"=>52642} {"_id"=>2, "name"=>"Mercedes", "price"=>57127} {"_id"=>3, "name"=>"Skoda", "price"=>9000} {"_id"=>4, "name"=>"Volvo", "price"=>29000} {"_id"=>5, "name"=>"Bentley", "price"=>350000} {"_id"=>6, "name"=>"Citroen", "price"=>21000} {"_id"=>7, "name"=>"Hummer", "price"=>41400} {"_id"=>8, "name"=>"Volkswagen", "price"=>21600} ``` 這是`read_all.rb`示例的輸出。 ## 計數文檔 `count`方法返回集合中匹配文檔的數量。 `count_documents.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') docs = client[:cars].find puts "There are #{docs.count} documents" `client.close` ``` 該示例計算`:cars`集合中的文檔數。 ```ruby docs = client[:cars].find ``` 我們從`cars`集合中檢索所有文檔。 ```ruby puts "There are #{docs.count} documents" ``` 我們打印退回文檔的數量。 ```ruby $ ./count_documents.rb There are 8 documents ``` `cars`集合中有八個文檔。 ## 讀取文檔 `find`方法采用可選的`filter`參數,該參數用于過濾傳入的數據。 `read_one.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client[:cars].find(:name => 'Volkswagen').each do |doc| puts doc end `client.close` ``` 該示例從`:cars`集合中讀取一個文檔。 ```ruby client[:cars].find(:name => 'Volkswagen').each do |doc| ``` `find`方法僅顯示包含大眾汽車的文檔。 ```ruby $ ./read_one.rb {"_id"=>8, "name"=>"Volkswagen", "price"=>21600} ``` 這是示例的輸出。 ## 查詢運算符 可以使用 MongoDB 查詢運算符(例如`$gt`,`$lt`或`$ne`)過濾數據。 `read_op.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') puts client[:cars].find("price" => {'$lt' => 30000}).to_a puts "**************************" client[:cars].find("price" => {'$gt' => 30000}).each do |doc| puts doc end `client.close` ``` 該示例打印所有汽車價格低于 30,000 的文檔,然后打印所有汽車價格高于 30,000 的文檔。 ```ruby puts client[:cars].find("price" => {'$lt' => 30000}).to_a ``` `$lt`運算符用于獲取價格低于 30,000 的汽車。 ```ruby $ ./read_op.rb {"_id"=>3, "name"=>"Skoda", "price"=>9000} {"_id"=>4, "name"=>"Volvo", "price"=>29000} {"_id"=>6, "name"=>"Citroen", "price"=>21000} {"_id"=>8, "name"=>"Volkswagen", "price"=>21600} ************************** {"_id"=>1, "name"=>"Audi", "price"=>52642} {"_id"=>2, "name"=>"Mercedes", "price"=>57127} {"_id"=>5, "name"=>"Bentley", "price"=>350000} {"_id"=>7, "name"=>"Hummer", "price"=>41400} ``` 這是示例的輸出。 `$and`和`$or`邏輯運算符可用于組合多個表達式。 `read_and_or.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') puts client[:cars].find('$or' => [{:name => "Audi"}, {:name => "Skoda" }]).to_a puts "*************************************" puts client[:cars].find('$and' => [{:price => {'$gt' => 20000}}, {:price => {'$lt' => 50000 }}]).to_a client.close ``` 該示例同時顯示了`$or`和`$and`運算符。 ```ruby puts client[:cars].find('$or' => [{:name => "Audi"}, {:name => "Skoda" }]).to_a ``` `$or`運算符用于返回名稱為 Audi 或 Skoda 的文檔。 ```ruby puts client[:cars].find('$and' => [{:price => {'$gt' => 20000}}, {:price => {'$lt' => 50000 }}]).to_a ``` `$and`運算符檢索價格介于 20,000 和 50,000 之間的汽車。 ```ruby $ ./read_and_or.rb {"_id"=>1, "name"=>"Audi", "price"=>52642} {"_id"=>3, "name"=>"Skoda", "price"=>9000} ************************************* {"_id"=>4, "name"=>"Volvo", "price"=>29000} {"_id"=>6, "name"=>"Citroen", "price"=>21000} {"_id"=>7, "name"=>"Hummer", "price"=>41400} {"_id"=>8, "name"=>"Volkswagen", "price"=>21600} ``` 這是示例的輸出。 ## 投影 投影確定要在結果集中的每個文檔中包括或排除的字段。 `projection.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') cursor = client[:cars].find({}, { :projection => {:_id => 0} }) cursor.each { |doc| puts doc } `client.close` ``` 該示例從輸出中排除`_id`字段。 ```ruby cursor = client[:cars].find({}, { :projection => {:_id => 0} }) ``` 我們在`find`方法的第二個參數中指定`:projection`選項。 ```ruby $ ./projection.rb {"name"=>"Audi", "price"=>52642} {"name"=>"Mercedes", "price"=>57127} {"name"=>"Skoda", "price"=>9000} {"name"=>"Volvo", "price"=>29000} {"name"=>"Bentley", "price"=>350000} {"name"=>"Citroen", "price"=>21000} {"name"=>"Hummer", "price"=>41400} {"name"=>"Volkswagen", "price"=>21600} ``` 這是示例的輸出。 尚未包含`_id`。 ## 限制數據輸出 `limit`方法指定要返回的文檔數,`skip`方法指定要跳過的文檔數。 `skip_limit.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') docs = client[:cars].find().skip(2).limit(5) docs.each do |doc| puts doc end `client.close` ``` 該示例從`testdb.cars`集合中讀取,跳過前兩個文檔,并將輸出限制為五個文檔。 ```ruby docs = client[:cars].find().skip(2).limit(5) ``` `skip`方法跳過前兩個文檔,`limit`方法將輸出限制為五個文檔。 ```ruby $ ./skip_limit.rb {"_id"=>3, "name"=>"Skoda", "price"=>9000} {"_id"=>4, "name"=>"Volvo", "price"=>29000} {"_id"=>5, "name"=>"Bentley", "price"=>350000} {"_id"=>6, "name"=>"Citroen", "price"=>21000} {"_id"=>7, "name"=>"Hummer", "price"=>41400} ``` 這是示例的輸出。 ## 聚合 聚合計算集合中數據的聚合值。 `sum_all_cars.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL agr = [{"$group" => {:_id => 1, :all => { "$sum" => "$price" } }}]; client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client[:cars].aggregate(agr).each { |doc| puts doc } ``` 該示例計算集合中所有汽車的價格。 ```ruby agr = [{"$group" => {:_id => 1, :all => { "$sum" => "$price" } }}]; ``` `$sum`運算符計算并返回數值的總和。 `$group`運算符通過指定的標識符表達式對輸入文檔進行分組,并將累加器表達式(如果指定)應用于每個組。 ```ruby client[:cars].aggregate(agr).each { |doc| puts doc } ``` `aggregate`方法將聚合操作應用于`cars`集合。 ```ruby $ ./sum_all_cars.rb {"_id"=>1, "all"=>609727} ``` 所有價格的總和是 619,369。 我們可以使用`$match`運算符來選擇要匯總的特定汽車。 `sum_two_cars.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL agr = [{"$match" => {"$or" => [ { :name => "Audi" }, { :name => "Volvo" }]}}, {"$group" => {:_id => 1, :sumOfTwo => { "$sum" => "$price" } }}]; client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client[:cars].aggregate(agr).each { |doc| puts doc } `client.close` ``` 該示例計算奧迪和沃爾沃汽車的價格總和。 ```ruby agr = [{"$match" => {"$or" => [ { :name => "Audi" }, { :name => "Volvo" }]}}, {"$group" => {:_id => 1, :sumOfTwo => { "$sum" => "$price" } }}]; ``` 該表達式使用`$match`,`$or`,`$group`和`$sum`運算符執行任務。 ```ruby $ ./sum_two_cars.rb {"_id"=>1, "sumOfTwo"=>81000} ``` 兩輛車的價格之和為 81,642。 ## 插入文檔 `insert_one`方法將單個文檔插入到集合中。 `insert_doc.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') doc = { :_id => 9, :name => "Toyota", :price => 37600 } client[:cars].insert_one doc `client.close` ``` 該示例將一輛汽車插入`cars`集合。 ```ruby doc = { :_id => 9, :name => "Toyota", :price => 37600 } ``` 這是要插入的文檔。 ```ruby client[:cars].insert_one doc ``` `insert_one`方法將文檔插入到集合中。 ```ruby > db.cars.find({_id:9}) { "_id" : 9, "name" : "Toyota", "price" : 37600 } ``` 我們用`mongo`工具確認插入。 ## 插入許多文檔 `insert_many`方法將多個文檔插入一個集合中。 `create_collection.rb` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') result = client[:continents].insert_many([ { :_id => BSON::ObjectId.new, :name => 'Africa' }, { :_id => BSON::ObjectId.new, :name => 'America' }, { :_id => BSON::ObjectId.new, :name => 'Antarctica' }, { :_id => BSON::ObjectId.new, :name => 'Australia' }, { :_id => BSON::ObjectId.new, :name => 'Asia' }, { :_id => BSON::ObjectId.new, :name => 'Europe' } ]) puts "#{result.inserted_count} documents were inserted" `client.close` ``` 該示例創建一個大洲集合并將六個文檔插入其中。 ```ruby result = client[:continents].insert_many([ { :_id => BSON::ObjectId.new, :name => 'Africa' }, { :_id => BSON::ObjectId.new, :name => 'America' }, { :_id => BSON::ObjectId.new, :name => 'Antarctica' }, { :_id => BSON::ObjectId.new, :name => 'Australia' }, { :_id => BSON::ObjectId.new, :name => 'Asia' }, { :_id => BSON::ObjectId.new, :name => 'Europe' } ]) ``` 使用`insert_many`方法將六個記錄的數組插入到新集合中。 `BSON::ObjectId.new()`創建一個新的`ObjectID`,這是用于標識文檔的唯一值,而不是整數。 ```ruby puts "#{result.inserted_count} documents were inserted" ``` 返回結果的`inserted_count`給出成功插入的文檔數。 ```ruby > db.continents.find() { "_id" : ObjectId("57263c0f81365b266b17358c"), "name" : "Africa" } { "_id" : ObjectId("57263c0f81365b266b17358d"), "name" : "America" } { "_id" : ObjectId("57263c0f81365b266b17358e"), "name" : "Antarctica" } { "_id" : ObjectId("57263c0f81365b266b17358f"), "name" : "Australia" } { "_id" : ObjectId("57263c0f81365b266b173590"), "name" : "Asia" } { "_id" : ObjectId("57263c0f81365b266b173591"), "name" : "Europe" } ``` `continents`集合已成功創建。 ## 修改文檔 `delete_one`方法用于刪除文檔,`update_one`用于更新文檔。 `mofify.js` ```ruby #!/usr/bin/ruby require 'mongo' Mongo::Logger.logger.level = ::Logger::FATAL client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'testdb') client[:cars].delete_one({:name => "Skoda"}) client[:cars].update_one({:name => "Audi"}, '$set' => {:price => 52000}) `client.close` ``` 該示例刪除包含 Skoda 的文檔并更新 Audi 的價格。 ```ruby client[:cars].delete_one({:name => "Skoda"}) ``` `delete_one`刪除`Skoda`的文檔。 ```ruby client[:cars].update_one({:name => "Audi"}, '$set' => {:price => 52000}) ``` 通過`update_one`方法將 Audi 的價格更改為 52,000。 `$set`運算符用于更改價格。 ```ruby > db.cars.find() { "_id" : 1, "name" : "Audi", "price" : 52000 } { "_id" : 2, "name" : "Mercedes", "price" : 57127 } { "_id" : 4, "name" : "Volvo", "price" : 29000 } { "_id" : 5, "name" : "Bentley", "price" : 350000 } { "_id" : 6, "name" : "Citroen", "price" : 21000 } { "_id" : 7, "name" : "Hummer", "price" : 41400 } { "_id" : 8, "name" : "Volkswagen", "price" : 21600 } { "_id" : 9, "name" : "Toyota", "price" : 37600 } ``` 我們使用`mongo`工具確認更改。 在本教程中,我們使用了 MongoDB 和 Ruby。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看