MongoDB实战第二版笔记(4)第三章
1、Ruby新手看官网,20分钟入门。博文不展开描述。
2、通过RubyGems安装MongoDB Ruby驱动。
gem install mongo
创建connect.rb文件
touch connect.rb
vim connect.rh
文件加入内容
require 'rubygems'
require 'mongo'
$client = Mongo::Client.new(['127.0.0.1:2017'],:database => 'tutorial')
$users = $client[:users]
puts 'connected'
运行代码 ruby connect.rb
3、原生ruby和json区别在于,前者是哈希符号(=>)而后者用冒号分割键值。ruby1.9也可以冒号分割键值,但为兼容性,坚持使用哈希符号。
4、利用ruby的shell,Irb,一个REPL(read,evaluate,print loop)控制台,输入动态执行的ruby代码。Irb编写任意代码都可保存在脚本里,其允许输入不同命令,有数据则返还命令结果,即=>符号后显示的东西。
![](https://i-blog.csdnimg.cn/blog_migrate/f72bf780c227a2c601789a985e32ee69.png)
5、示例1:添加文档数据
用Ruby hash哈希表示赋值给变量。
smith = ["last_name"=>"smith","age"=>30]
jones = ["last_name"=>"jones","age"=>40]
保存文档,需要将对象传递给集合的insert方法。每次返回可保存到变量里便于后期查询使用的唯一ID。
smith_id = $users.insert_one(smith)
jsone_id = $users.insert_one(jones)
6、查询保存的文档数据,使用find()方法
![](https://i-blog.csdnimg.cn/blog_migrate/47982d6518ac53fe2b8d6b54e75b4669.png)
7、查询与光标
- 标准find方法
(1) 查询last_name为smith的用户$users.find({"last_name"=>"smith"}).to_a
(2)查询age大于30的用户 $users.find({"age"=>{"$gt"=>30}}).to_a
Irb实现 $users.find({"age"=>{"$gt"=>30}})
,结果在 Mongo::Collection::View对象返回,其扩展Iterable接口,方便迭代集合。
-
光标示例,$gt查询结果
cursor = $users.find({"age"=>{"$gt"=>30}}) cursor.each do |doc| puts doc["last_name"] end
如果集合没有last_name字段,则会打印nil(Ruby的null值),而shell会自动迭代
find()
结果的20个光标,使用it
命令收到迭代。
8、更新与删除
(1)至少两参数:查询选择权和更新文档。
(2)示例,找到last_name为smith的用户并把city设置为Chicago
$users.find({"last_name"=>"smith"}).update_one({"set"=>{"city"=>"Chicago"}})
(3)运行查询查看修改
$users.find({"last_name"=>"smith"}).to_a
(4)remove方法,接受选择器参数,删除匹配的文档数据。不提供参数则删除集合所有数据。示例只删除匹配第一个age大于40的用户
$users.find({"age"=>("$gte"=>40)}).delete_one
删除所有文档
$users.find({"age"=>("$gte"=>40)}).delete_many
(5)无参数时drop方法会删除所有剩余的文档
$users.drop
9、在connect.rh中,创建Ruby数据库对象引用admin数据库,并将命令给command方法,实例列出所有的数据库和磁盘大小。
$admin_db = $client.use('admin')
$admin_db.command({"listData"})
10、remove命令不会真正删除集合,drop_collection会删除集合和索引
db = $client.use('tutorial')
db['users'].drop
11、所有MongoDB驱动都执行三个主要功能: (1)生成MongoDB对象ID,默认存储在所有文档_id字段。(2)把任意语言表示的文档对象转换为BSON或从BSON转换回来。BSON使用MongoDB使用的二进制JSON格式。(3)使用TCP socket与数据库连接通信,使用MongoDB自定义协议。
12、MongoDB文档需要主键而且唯一,存储在文档_id字段,开发者可以自定义值为_id值,不提供则MongoDB使用自己的默认值。发送文档数据给服务器之前,驱动会检测是否有_id字段,没有就会生成对象_id。
13、MongoDB的对象ID是12个字节的16进制,具有如下结构:
![](https://i-blog.csdnimg.cn/blog_migrate/7cf83aa77a870ab1204166f0bf1feabd.png)
14、对象ID具有这种格式是由于ID是在驱动里生成而非服务器上生成。RDMS是由服务器自增,因而服务器成为生成键的瓶颈。
15、MongoDB对象ID带有时间戳,使得绝大部分驱动可获取时间戳来提供文档创建时间解析最近的描述。例Ruby驱动用对象ID的generation_time来获取ID的创建时间,作为Ruby Time对象。
16、MongoDB允许在不知数据结构情况下插入数据,而DBMS需要提前定义Schema,要提前知道要存储的数据。