MongoDB权威指南-增删查改

MongoDB权威指南
增删查改
插入并保存文档
批量插入
db.foo.insert({“bar”:”baz”})
这个操作会给文档自动增加一个”_id”键(要是原来没有的话)
db.foo.batchInsert([{“_id”:0},{“_id”:1},{“_id”:2}])
当前版本的MongoDB能接受的最大消息长度是48MB,如果试图插入48MB以上的数据,多数驱动程序会将这个批量插入请求拆分为多个48MB的批量插入请求。
如果在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而这个文档以及之后的所有文档全部插入失败。
如果希望batchInsert忽略错误并且继续执行后续插入,可以使用continueOnError选项。
插入校验
插入数据时,MongoDB只对数据进行最基本的检查:检查文档的基本结构,如果没有”_id”字段,就自动增加一个。检查大小:所有文档都必须小于16MB
由于MongoDB只进行最基本的检查,应该只允许信任的源(比如你的应用程序服务器)连接数据库。
删除文档
删除速度
db.foo.remove()
上述命令会删除foo集合中的所有文档。但是不会删除集合本身,也不会删除集合的元信息。
db.mailing.remove({“opt-out”:true})
删除操作是永久性的,不能撤销,也不能恢复。
如果要清空整个集合,那么使用drop直接删除集合会更快(然后在这个空集合上重建各项索引)
更新文档
文档替换
使用修改器
通常文档只会有一部分要更新。可以使用原子性的更新修改器update modifier
db.analytics.update({“url”:”www.example.com”},{“inc”:{“pageviews”:1}})  
            使用修改器时,”_id”的值不能改变。  
            “
set”修改器
set inc”修改器用来增加已有键的值,或者该键不存在那就创建一个。
inc inc"键的值必须为数字,不能使用字符串、数组或其他非数字的值。否则会提示"Modifier " incallowedfornumbersonly push”会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
使用” each"" push”操作添加多个值。
可以将” slice"" push”组合在一起使用,这样就可以保证数组不会超出设定好的最大长度。
db.movies.update({“genre”:”honor”},{“push":{"top10":{"$each":["movie 1","movie 2"],"$slice”:-10}}})  
                最后,可以在清理元素之前使用”
sort”,只要向数组中添加子对象就需要清理。
db.movies.find({“genre”:”horror”},{“push”:{“top10”:{“ each":["name":"movie1","rating":6.5,"name":"movie2","rating":4.3]," slice”:-10,”sort”:{“rating”:-1}}}})  
            将数组作为数据集使用  
                如果想将数组作为数据集使用,保证数组内的元素不会重复。可以在查询文档中用”
ne”(not exist的缩写)来实现。例如,要是作者不在引文列表中,就添加进去,可以这么做:
db.papers.update({“authors cited”:{“ne":"Richie"}},{"$push”:{“authors cited”:”Richie”}})  
                添加新地址时,用”
addToSet”可以避免插入重复地址:
db.users.update({“_id”:ObjectId(“a123…321a”)},{“addToSet”:{“emails”:”joe@mail.com”}})  
                将”
addToSet"和" each ne"和" pushdb.users.update(id:ObjectId(a123321a),$addToSet":"emails":"$each:[jane@apple.com,jay@gmail.com,jason@qq.com]) pop"。{"pop":{"key":1}} 从数组末尾删除一个元素,{"$pop”:{“key”:-1}} 则从头部删除。  
                基于位置的数组修改器  
                    MongoDB提供了定位操作符”
”,用来定位查询文档已经匹配到的数组元素,并进行更新。
db.blog.update({“comments.author”:”John”},{“set":{"comments.$.author”:”Jim”}})  
            修改器速度
inc能就地修改,所以非常快。而数组修改器可能会改变文档的大小,就会慢一些。
当文档插入到MongoDB中时,依次插入的文档在磁盘的位置是相邻的。因此,如果一个文档变大了,原先的位置就放不下这个文档了,这个文档就会被移动到集合中的另一个位置。
MongoDB不得不移动一个文档时,它会修改集合的填充因子padding-factor。填充因子是MongoDB为每个新文档预留的增长空间。
写作本书时,MongoDB仍然不能很好地重用空白空间,因此频繁移动文档会产生大量空的数据文件。
extend a:7fabcd was empty,skipping ahead.这个消息提示本身没什么影响,但是他指出你当前拥有太多的碎片,可能需要进行压缩。

            可以使用usePowerOf2Sizes选项以提高磁盘复用率。

db.runCommand({“collMod”:collectionName,”usePowerOf2Sizes”:true})
在已有的集合上运行这个命令或者更改这个选项的值不会对现有数据产生影响。

            upsert
                upsert非常方便,同一套代码既可以用于创建文档又可以用于更新文档。
                update的第3个参数表示这是一个upsert
                db.analytics.update({"url":"/blog"},{"$inc":{"previews":1}},true)
        更新多个文档
            默认情况下,更新只能对符合匹配条件的第一个文档执行操作。要更新所有匹配的文档,可以将update的第               4个参数设置为true。db.users.update({"birthday":"10/13/1978"},{"$set":{"gift":"Happy"}},false,true)
            想要知道多文档更新到底更新了多少文档,可以运行getLastError命令(可以理解为"返回最后一次操作的相关信息")。键"n"的值就是被更新文档的数量。db.runCommand({getLastError:1})返回被更新的文档
            通过findAndModify命令得到被更新的文档。
写入安全机制
    写入安全Write Concern是一种客户端设置,用于控制写入的安全级别。
    两种最基本的写入安全机制:应答式写入acknowledged write和非应答式写入unacknowledged write。
     shell与客户端程序对非应答式写入的实际支持不一样:shell在执行非应答式写入后,会检查最后一个操作是否成功。如果在集合上执行了一些列无效操作后,最后执行了一个有效操作,shell并不会提示有错误发生。
    可以调用getLastError手动强制在shell中进行检查。
    在默认写入安全机制发生变化前,任何语言都没有使用MongoClient作为类名,所以如果你的代码使用了这个类名,说明你的代码是写入安全的。
    如果使用的连接不是MongoClient,应在必要时将旧代码中的非应答式写入改成应答式写入。
查询
    4.1-find简介
        4.1.1-指定要返回的键
            find和findOne:db.users.find({"age":27})
            db.users.find({},{"username":1,"email":1})
            默认情况下,"_id"这个键总是被返回,即便没有指定要返回这个键
            db.users.find({},{"fatal_weakness":0})
            把_id键剔除掉
                db.users.find({},{"username":1,"_id":0})
        4.1.2-限制
            传递给数据库的查询文档的值必须是常量
    4.2-查询条件
        4.2.1-查询条件
            "$lt","$lte","gt"和"$gte"就是全部的比较操作符
                find和findOne:db.users.find({"age":{"$gte":18,"$lt":30}})
            条件操作符"$ne"
                db.users.find({"username":{"$ne":"joe"}})
        4.2.2-OR查询
            两种方式进行OR查询:$in用于查询一个键的多个值,$or可以在多个键中查询任意的值
            "$in"操作符再加一个条件数组
            相对的"$nin"
                .find({"ticket_no":{"$nin":[123,456,789]}})
            "$or"
                .find({"$or":[{"ticket_no":{"$nin":[123,456,789]}},{"winner":true}] })
        4.2.3-$not
            $not是元条件句,即可以用在其他条件之上
        4.2.4-条件语义
            有一些元操作符也位于外层文档中,比如$and,$or和$not
                db.users.find({"$and":[{"x":{"$lt":1}},{"x":4}] })
    4.3-特定类型的查询
        null
            db.c.find({"y":null})
            null不仅会匹配某个键的值为null的文档,而且会匹配不包含这个键的文档
        正则表达式
            db.users.find({"name":/joe/i})
            MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式
        查询数组
            $all
            $size
                可以用它来查询特定长度的数组
                db.foo.find({"fruit":{"$size":3}})
            $slice
                $slice可返回某个键匹配的数组元素的一个子集
                db.blog.posts.findOne(criteria,{"$comments":{"$slice":[23,10]}})
        查询内嵌文档
    4.4-$where查询
        $where
            不是非常必要时,一定要避免使用$where查询,因为他的速度要比常规查询慢很多.每个对象都要从BSON转换为javascript对象,然后通过$where表达式来运行.而且$where不能使用索引,所以只在走投无路时使用$where
        服务器端脚本
            在服务器上运行javascript要注意安全性
            可以在运行mongod时指定--noscripting选项,完全关闭javascript执行
    4.5-游标
        4.5.1-limit,skip和sort
        4.5.2-避免使用skip略过大量结果
            用skip略过少量文档还是不错的,要是数量非常多得话,skip就会变得很慢
        4.5.3-高级查询选项
            $min
                可以用$min强制指定一次索引扫描的下边界
            $max
                可以用$min强制指定一次索引扫描的上边界
            $showDiskLoc
                在查询结果中添加一个$diskLoc字段,用于显示该条结果在磁盘上的位置
        4.5.4-获取一致结果
        4.5.5-游标生命周期
            在服务器端,游标消耗内存和其他资源,所以要尽量保证尽快释放游标
    4.6-数据库命令
        数据库命令工作原理

增删查改
插入并保存文档
批量插入
db.foo.insert({“bar”:”baz”})
这个操作会给文档自动增加一个”_id”键(要是原来没有的话)
db.foo.batchInsert([{“_id”:0},{“_id”:1},{“_id”:2}])
当前版本的MongoDB能接受的最大消息长度是48MB,如果试图插入48MB以上的数据,多数驱动程序会将这个批量插入请求拆分为多个48MB的批量插入请求。
如果在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而这个文档以及之后的所有文档全部插入失败。
如果希望batchInsert忽略错误并且继续执行后续插入,可以使用continueOnError选项。
插入校验
插入数据时,MongoDB只对数据进行最基本的检查:检查文档的基本结构,如果没有”_id”字段,就自动增加一个。检查大小:所有文档都必须小于16MB
由于MongoDB只进行最基本的检查,应该只允许信任的源(比如你的应用程序服务器)连接数据库。
删除文档
删除速度
db.foo.remove()
上述命令会删除foo集合中的所有文档。但是不会删除集合本身,也不会删除集合的元信息。
db.mailing.remove({“opt-out”:true})
删除操作是永久性的,不能撤销,也不能恢复。
如果要清空整个集合,那么使用drop直接删除集合会更快(然后在这个空集合上重建各项索引)
更新文档
文档替换
使用修改器
通常文档只会有一部分要更新。可以使用原子性的更新修改器update modifier
db.analytics.update({“url”:”www.example.com”},{“inc”:{“pageviews”:1}})  
        使用修改器时,”_id”的值不能改变。  
        “
set”修改器
set inc”修改器用来增加已有键的值,或者该键不存在那就创建一个。
inc inc"键的值必须为数字,不能使用字符串、数组或其他非数字的值。否则会提示"Modifier " incallowedfornumbersonly push”会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
使用” each"" push”操作添加多个值。
可以将” slice"" push”组合在一起使用,这样就可以保证数组不会超出设定好的最大长度。
db.movies.update({“genre”:”honor”},{“push":{"top10":{"$each":["movie 1","movie 2"],"$slice”:-10}}})  
            最后,可以在清理元素之前使用”
sort”,只要向数组中添加子对象就需要清理。
db.movies.find({“genre”:”horror”},{“push”:{“top10”:{“ each":["name":"movie1","rating":6.5,"name":"movie2","rating":4.3]," slice”:-10,”sort”:{“rating”:-1}}}})  
        将数组作为数据集使用  
            如果想将数组作为数据集使用,保证数组内的元素不会重复。可以在查询文档中用”
ne”(not exist的缩写)来实现。例如,要是作者不在引文列表中,就添加进去,可以这么做:
db.papers.update({“authors cited”:{“ne":"Richie"}},{"$push”:{“authors cited”:”Richie”}})  
            添加新地址时,用”
addToSet”可以避免插入重复地址:
db.users.update({“_id”:ObjectId(“a123…321a”)},{“addToSet”:{“emails”:”joe@mail.com”}})  
            将”
addToSet"和" each ne"和" pushdb.users.update(id:ObjectId(a123321a),$addToSet":"emails":"$each:[jane@apple.com,jay@gmail.com,jason@qq.com]) pop"。{"pop":{"key":1}} 从数组末尾删除一个元素,{"$pop”:{“key”:-1}} 则从头部删除。  
            基于位置的数组修改器  
                MongoDB提供了定位操作符”
”,用来定位查询文档已经匹配到的数组元素,并进行更新。
db.blog.update({“comments.author”:”John”},{“set":{"comments.$.author”:”Jim”}})  
        修改器速度
inc能就地修改,所以非常快。而数组修改器可能会改变文档的大小,就会慢一些。
当文档插入到MongoDB中时,依次插入的文档在磁盘的位置是相邻的。因此,如果一个文档变大了,原先的位置就放不下这个文档了,这个文档就会被移动到集合中的另一个位置。
MongoDB不得不移动一个文档时,它会修改集合的填充因子padding-factor。填充因子是MongoDB为每个新文档预留的增长空间。
写作本书时,MongoDB仍然不能很好地重用空白空间,因此频繁移动文档会产生大量空的数据文件。
extend a:7fabcd was empty,skipping ahead.这个消息提示本身没什么影响,但是他指出你当前拥有太多的碎片,可能需要进行压缩。

        可以使用usePowerOf2Sizes选项以提高磁盘复用率。

db.runCommand({“collMod”:collectionName,”usePowerOf2Sizes”:true})
在已有的集合上运行这个命令或者更改这个选项的值不会对现有数据产生影响。

        upsert
            upsert非常方便,同一套代码既可以用于创建文档又可以用于更新文档。
            update的第3个参数表示这是一个upsert
            db.analytics.update({"url":"/blog"},{"$inc":{"previews":1}},true)
    更新多个文档
        默认情况下,更新只能对符合匹配条件的第一个文档执行操作。要更新所有匹配的文档,可以将update的第               4个参数设置为true。db.users.update({"birthday":"10/13/1978"},{"$set":{"gift":"Happy"}},false,true)
        想要知道多文档更新到底更新了多少文档,可以运行getLastError命令(可以理解为"返回最后一次操作的相关信息")。键"n"的值就是被更新文档的数量。db.runCommand({getLastError:1})返回被更新的文档
        通过findAndModify命令得到被更新的文档。

写入安全机制
写入安全Write Concern是一种客户端设置,用于控制写入的安全级别。
两种最基本的写入安全机制:应答式写入acknowledged write和非应答式写入unacknowledged write。
shell与客户端程序对非应答式写入的实际支持不一样:shell在执行非应答式写入后,会检查最后一个操作是否成功。如果在集合上执行了一些列无效操作后,最后执行了一个有效操作,shell并不会提示有错误发生。
可以调用getLastError手动强制在shell中进行检查。
在默认写入安全机制发生变化前,任何语言都没有使用MongoClient作为类名,所以如果你的代码使用了这个类名,说明你的代码是写入安全的。
如果使用的连接不是MongoClient,应在必要时将旧代码中的非应答式写入改成应答式写入。
查询
4.1-find简介
4.1.1-指定要返回的键
find和findOne:db.users.find({“age”:27})
db.users.find({},{“username”:1,”email”:1})
默认情况下,”_id”这个键总是被返回,即便没有指定要返回这个键
db.users.find({},{“fatal_weakness”:0})
把_id键剔除掉
db.users.find({},{“username”:1,”_id”:0})
4.1.2-限制
传递给数据库的查询文档的值必须是常量
4.2-查询条件
4.2.1-查询条件
lt"," lte”,”gt”和” gtefindfindOne:db.users.find(age:$gte":18,"$lt:30) ne”
db.users.find({“username”:{“ne”:”joe”}})  
        4.2.2-OR查询  
            两种方式进行OR查询:
in用于查询一个键的多个值, or in”操作符再加一个条件数组
相对的” nin.find(ticketno:$nin:[123,456,789]) or”
.find({“or":[{"ticket_no":{"$nin”:[123,456,789]}},{“winner”:true}] })  
        4.2.3-
not
not,4.2.4, and, or not
db.users.find({“and":[{"x":{"$lt”:1}},{“x”:4}] })  
    4.3-特定类型的查询  
        null  
            db.c.find({“y”:null})  
            null不仅会匹配某个键的值为null的文档,而且会匹配不包含这个键的文档  
        正则表达式  
            db.users.find({“name”:/joe/i})  
            MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式  
        查询数组
all
sizedb.foo.find(fruit:$size:3) slice
slicedb.blog.posts.findOne(criteria,$comments":"$slice:[23,10])4.4 where查询
where,使 where查询,因为他的速度要比常规查询慢很多.每个对象都要从BSON转换为javascript对象,然后通过 where. where不能使用索引,所以只在走投无路时使用 wherejavascriptmongodnoscripting,javascript4.54.5.1limit,skipsort4.5.2使skipskip,,skip4.5.3 min
可以用 min max
可以用 min showDiskLoc
在查询结果中添加一个$diskLoc字段,用于显示该条结果在磁盘上的位置
4.5.4-获取一致结果
4.5.5-游标生命周期
在服务器端,游标消耗内存和其他资源,所以要尽量保证尽快释放游标
4.6-数据库命令
数据库命令工作原理
DISSIDIA思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值