mongodb基本操作

创建集合

db.createCollection(name,Opt)

可以自己创建一个集合,Opt是创建时的指定参数,可省略。直接插入数据会自动创建集合
这个函数可以用来创建固定集合

插入

db.foo.insert({key:123})
db.foo.insertOne({key:123})
db.foo.insert([{key:1},{key:2}])
db.foo.insertMany([{key:1},{key:2}])

插入时如果没有指定"_id",会自动添加一个唯一的ObjectID,insert相同_id的数据会出错
插入多个文档时使用批量插入效率更高,因为只处理一个tcp请求
mongo 提供了 insertOne与insertMany来分别处理一个插入与多个插入的情况

db.foo.save({"_id:1",key:1}) 

如果有相同_id的情况,insert会报错save会调换掉集合中_id相同的文档

删除

db.users.remove()-> 会报错
db.users.remove({}) ->删除所有记录
db.user.remove({name:"tony"}) 删除不会删除索引
db.collectionname.drop() 直接删除整个集合,速度快,索引一并消除
db.dropDatabase() 删除整个数据库

查找
查询逻辑运算符

$lt:存在并小于
$lte:存在并小于等于
$gt:存在并大于
$gte:存在并大于等于
$ne:不存在或存在但不等于-> 这个运算符无法利用索引
$in:存在并在指定数组中
$nin:不存在或不在指定数组中 -> 这个运算符无法利用索引
$or:匹配两个或多个条件中的一个
$and:匹配全部条件
$exists: 是否存在

find 支持正则表达式,返回的是游标
db.foo.find() 非结构化方法展示所有文档
db.foo.find().pretty() 结构化方法展示所有文档
db.foo.find().skip(400).limit(10).sort({data:-1}) -> 使用skip的时候会去跳过指定的数量,效率低下,可以使用find({})在条件中可以指定匹配条件 来指明下一个结果集从何处开始

投影

db.foo.find({},{username:1}) 

指定需要返回/不返回的数据
_id字段必须明确指定不返回,否则默认返回

查询条件

db.foo.find({age:{"$gte":10,"$lte:30"},name:{"$ne":"joe"}})
db.foo.find({age:{"$in":[1,2,3,4]}})
db.foo.find({"$or":[{age:{"$in":[22]}},{winner:true}]})
db.foo.find({age:{"$not":{"$mod":[5,1]}}})
db.c.find({"z" : {"$in" : [null], "$exists" : true}}) 

null只匹配自身和不存在的文档

mongo使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,其能有效地匹配字符串

db.posts.find({post_text:{$regex:"runoob","$options":"$i"}})
//不区分大小写查找字符串runoob

如果文档中字段设置了索引,那么使用索引相比于正则表达式匹配查找所有的数据查询速度更快

查询数组

db.food.find({"fruit":{"$all":["apple","banana"]}}) 
// 找到数组里既有apple又有banana的文档,顺序无所谓
db.food.find({"fruit":"apple"})
// 如果fruit数组中有apple就能查到 
db.food.find({"fruit.2":apple}) //使用数组下标指定
db.food.find({fruit:{"$size":2}}) //找到指定长度的数组

内嵌文档查询

db.people.find({"name.first":"joe"})
db.people.find({comments:{"$elemMatch":{ahthor:"joe",age:32}}}) 
//使用elemMatch限定条件分组 (在子文档有多个条件需要匹配时,可以考虑使用)

更新文档
updateOne表示无论条件匹配到多少条记录,始终只更新第一条
updateMany表示条件匹配到了多少条就更新多少条
updateOne与updateMany要求更新条件必须具有:

$push:增加一个对象到数组底部
$pushAll:增加多个对象到数组底部
$pop:从数组底部删除一个对象
$pull:如果匹配指定的值,从数组中删除相应的对象
$pullAll:如果匹配任意的值,从数据中删除相应的对象
$AddToSet:如果不存在则增加一个值到数组
db.foo.update({key:1},{key:2}) 
db.foo.update({key:1},{"$inc":{num:1}}) 
// 指定项增加减少
db.foo.update({key:1},{"$set":{age:3}}) 
// 匹配一项,如果不存在指定键创建它,否则更新
db.foo.update({key:1},{"$unset":{age:1}}) 
// 删除指定项
db.foo.update({key:1},{"$push":{comments:{name:"joe",age:23}}}) 
// 添加数组,如果数组不存在自动创建
db.foo.update({key:1},{"$addToSet":{comments:{name:"joe",age:23}}}) 
// 可以避免重复添加数组
db.foo.update({key:1},{"$addToSet":{emils:{"$each":["kk@cc","www@33"]}}}) 
// 使用each一次在数组添加多个元素
db.foo.update({key:1},{"$pop":{emils:1}}) 
//使用pop从头部或尾部删去数组元素
db.foo.update({key:1},{"$pull":{emils:"kk@cc"}}) 
//使用pull基于特定条件删去指定元素,会将所有匹配都删掉
db.foo.update({comments.name:"joe"},{"$set":{comments.$.name:"jim"}}) 
//通过定位查找符$找到元素来更新

修改器

upsert是一种特殊的更新,如果没有文档符合更新条件,会创建一个新的文档,在Update第三个参数设置为true生效
update第四个参数可以控制是否更新所有匹配到的文档

创建索引

db.people.ensuerIndex({username:1},{name:"dvaaaaa",unique:true,dropDups=true,background=true}) 

如果索引包含N个键,对前几个键查询都有帮助,background如果不设置的话,在建立索引期间会阻塞所有请求。

db.runCommand({dropIndexes:"foo","index":"dvaadb.aaa"}) 
// 删除索引
db.runCommand({getLastError :1})
// 返回文档更新信息

使用findAndModify比较慢,它必须等待数据库的响应对于操作查询以及其他原子性操作很方便
上面的插入,删除,更新默认是不安全版本,即传给服务器命令后就不管了,还有安全的版本,会等待服务器返回,更安全但速度会很慢,安全版本在执行完操作后马上执行getLastError,如果出错了会抛出一个可被捕获的异常,开发者可以使用自己的语言去处理该错误。
多个shell会有多个数据库的连接,所以在一个shell里面插入数据后,另一个shell可能不能马上查到该数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值