Mongodb 操作入门以及CRUD

#mongodb server的启动

mongd --dbpath <the path of data>
/cloud/mongodb-3.2.9/bin/mongod --dbpath /cloud/mongodb-3.2.9/data/ >/dev/null 2>&1 &


#连接

mongo 127.0.0.1:27017/test #127.0.0.1是本地连接;27017是端口号,test是数据库名


#关闭服务器
db.shutdownServer()


#mongodb中,collection相当于表,文档相当于记录
#对于数据库的操作:db.help()
use dbname#切换(或创建)数据库,如果不存在,则在用到它的时候自动创建(比如插入文档时)
show dbs#列出所有数据库
show collections==db.getCollectionNames()==show tables(建议不使用)
db.stats()#查看数据库状态
db.dropDatabase()#删除当前数据库


#对于collection的操作:db.<collection>.help()
db.my_coll.count()#查询当前集合中文档的总数目
db.mycollection.find()#查询所有文档
db.mycollection.find({x:1})#查询指定文档


db.mycollection.insert({x:2,y:3,...})#插入文档


#更新符合条件的1个文档
db.mycollection.update({x:1},{x:111})#更新符合条件的文档
db.mycollection.update({x:1},{$set:{y:333}})#更新符合条件的文档的部分字段
db.mycollection.update({z:1},{z:111},true)#更新符合条件的文档,若不存在则创建


#更新符合条件的多个文档
db.mycollection.update({x:1}{$set:{x:2}},false,true)


db.mycoll.drop() #drop the collection删除该集合
db.mycoll.remove(query)#删除符合条件的所有文档


#索引
db.mycoll.getIndexes()#获取当前集合的索引情况,默认只有"_id"一个索引
#创建索引
#如果文档数目较多,创建索引需要一定的时间
#如果系统负载较重且有很多已存在的文档,不能直接使用这个命令创建索引--
#需要在使用数据库之前就将索引创建完成,否则严重影响数据库的性能
#由于索引会在插入文档后再次构建,所以会对写入造成一定影响,为了查询的高效值得
db.mydb_collection.ensureIndex({x:1})#x为1代表正向索引,-1代表逆向索引


#_id索引
系统默认的索引,不能被drop


#单键索引
最普通的索引


#多键索引
数组类型的变量,其值有多个
db.mydb_collection.insert({x:[1,2,3,4]})#执行后,这条文档的多建索引形成


#复合索引
#有时查询条件不止一个,这就要用到复合索引了
db.mydb_collection.ensureIndex({x:1,y:1})


#过期索引(TTL索引)在一段时间后会过期失效的索引
#索引过期后相应的数据会被删除
#适合存储一些比如用户登录的信息、日志信息
#用法注意:过期索引字段的值必须是ISODate类型,不能是时间戳,否则不会被自动删除
#索引过期后的删除操作(系统每60秒执行一次)存在误差,因为需要时间来执行啊
db.mydb_collection.ensureIndex({time:1},{expireAfterSeconds:10})
db.mydb_collection.insert({time:new Date()});


#全文索引
#每个集合只允许创建一个全文索引
db.articles.ensureIndex({key:"text"})#单个字段创建全文索引
db.articles.ensureIndex({key_1:"text",key_2:"text"})#多个字段创建全文索引
db.articles.ensureIndex({"$**":"text"})#所有字段创建全文索引
#使用全文索引来查询
db.articles.find({$text:{$search:"coffee"}})#查询包含"coffee"的文档
db.articles.find({$text:{$search:"aa bb"}})#查询包含"aa"或"bb"的文档
db.articles.find({$text:{$search:"aa bb -cc"}})#查询包含"aa"或"bb"但不含"cc"的文档
db.articles.find({$text:{$search:"\"aa\" \"bb\"}})#查询同时包含"aa"和"bb"的文档
db.articles.find({$text:{$search:"\"aa\" \"bb\" -cc"}})


#全文索引相似度查询
db.my_coll.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}})
#按照相似度来排序
db.my_coll.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}})
.sort({score:{$meta:"textScore"}})

#删除全文索引


#全文索引使用限制
1.每次查询只能指定一个$text查询
2.$text查询不能出现在$nor查询中($nor用来排除查询条件)
3.查询中若包含$text,hint将失效(hint用来强制指定将使用的索引)
4.MongoDB全文索引暂不支持中文


#索引的属性
1.指定索引的名字
db.my_coll.ensureIndex({x:1},{name:"my_index"})(如果不指定name默认的名字是x_1)
2.指定索引的唯一性(报错了。。。。)
db.my_coll.ensureIndex({x:1,y:1},{unique:true})当插入的文档索引字段相同时会报错,并插入失败
db.my_coll.ensureIndex({x:1,y:1},{name:"my_index"},{unique:true})(指定名字后无错),但不具有唯一性
3.指定索引的稀疏性(默认是false);true代表不为不包含指定索引的字段的文档创建索引(比如插入一条不包含索引字段的文档)
db.my_coll.ensureIndex({x:1,y:1},{sparse:true/false})
#稀疏索引带来的隐患
#当不在x字段上创建稀疏索引时,以下语句能够正确执行
db.my_coll.find({x:{$exists:true}})#查找含有字段x的所有文档
db.my_coll.find({x:{$exists:false}})#查找不含有字段x的所有文档
db.my_coll.remove({x:{$exists:true}})#删除含有字段x的所有文档


#不能在稀疏索引上查找不包含这个字段的文档,因为那些文档压根就没有被创建索引^_^
#用hint来强制指定使用索引,这时候返回结果为空
#这里有点不明白,道理确实是这样,但不使用hint时,执行结果在逻辑上却是正确的
db.my_coll.find({x:{$exists:false}}).hint("x_1")
4.指定索引的过期时间,也就是前面提到的过期索引


#地理位置索引
概念:把一些点的位置存放在mongodb中,创建索引后,可以按照位置来查找其他点
子分类:
2d索引:用于存储和查找平面上的点
2dsphere索引,用于存储和查找球面上的点
查找方式:
查找距离某个点一定距离内的点(附近的人)$near查询
查找某个形状内所包含的点(指定某市区)$geoWithin查询
#创建2d索引:表示方法: [经度,纬度]范围:经度[-180,180]纬度[-90,90]
db.location.ensureIndex({w:"2d"})
插入一些文档:
db.location.insert({w:[1,1]})
db.location.insert({w:[1,2]})
db.location.insert({w:[1,3]})
查询距离点[1,1]最近的点,默认返回最多100条文档:
db.location.find({w:{$near[1,1]}})
db.location.find({w:{$near:[1,3],$maxDistance:1}})#限制最远距离($minDistance在2d索引中不起作用)
#形状的表示方式
1.矩形:{$box:[[<x1>,<y1>],[<x2>,<y2>]]}
2.圆形:{$center:[[<x1>,<y1>],r]}
3.多边形:{$polygon:[[<x1>,<y1>],[<x2>,<y2>]],[<x3>,<y3>]...}
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
db.location.find({w:{$geoWithin:{$center:[[30,30],50]}}})
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[1,1],[100,90],[110,-90]]}}})
#geoNear查询
db.runCommand(
{geoNear:<collection>,
near:[x,y],
minDistance:(对2d索引无效)
maxDistance:
num:
...}
)


#2dsphere索引
db.location.ensureIndex({w:"2dsphere"})
#位置表示方式:GeoJSON:描述一个点,一条直线,多边形等
#格式:{type:"**",coordinates:[<coordinates>]}
#查询方式与2d索引类似,查阅相关文档


#索引构建情况分析
好处:加快查询速度
坏处:增加磁盘空间消耗,降低写入性能
1.mongostat查看mongodb运行状态的程序
用法:mongostat -h 127.0.0.1:27017;mongostat --help;
2.profile(0,1,2三个级别,0:off关闭状态不记录 1:记录超过slowms的操作 2:记录所有操作)
db.setProfilingLevel(0/1/2)#设定级别
db.getProfilingStatus()#查看详细状态
#记录的操作存放在system.profile集合中
db.system.profile.find().sort($natural:-1).limit(1)#查询最后一条操作
#$natural:-1代表按照时间顺序的逆序排序,1代表按照时间顺序排序
3.日志


4.explain分析
用法:语句后加".explain()"
例如:db.location.find().explain()


#mongodb安全
1.启动时指定--auth
创建用户:
db.createUser(
{
user:"<name>",
pwd:"<...>",
customData:{<any information>},
roles:[{role:"<role>",db:"<database>"},{role:"<role>",db:"<database>"}]
}
)
角色类型:read readWrite,dbAdmin,dbOwner,userAdmin(权限依次变大)
2.keyfile





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值