MongoDB基本操作(Nosql数据库入门与实践)

数据库建立

创建自定义数据库

use 数据库名

use goodsdb
如果goodsdb数据库不存在,则新建立数据库;如果goodsdb数据库存在,则连接该数据库
查看数据库
show dbs
对于刚刚新建的数据库没有显示,因为这个数据库里没有内容
统计某数据库信息
db.stats()
删除数据库
db.dropDatabase()  //删除当前数据库
不要随便使用,一般情况下具有不可恢复性
查看当前数据库下的集合名称
db.getCollectionNames()
查看数据库用户角色权限
show roles  //查看当前数据库的用户角色权限及用户名、密码等信息

Mongodb基本操作

插入、更新、删除、查询、索引、聚合、复制、分片等

插入文档

db.集合名.insert()

插入文档
db.goodsbaseinf.insert(
    {name:"《C语言编程》",price:32
    }
)
插入一条复杂文档
db.goodsbaseinf.insert(
{
    name:"《C语言》",
    bookprice:33.2,
    adddata:2017-10-1,
    allow:true,
    baseinf:{
    		ISBN:183838388,
    		press:"清华大学出版社"
    },
    tags:["good","book","it","Program"]
}
)
插入值里可以嵌套文档,避免传统关系里多表关联运算
insert命令可以包含数组,用于记录分类等信息
插入多条文档
db.goodsbaseinf.insert(
 [
     {
      item:"小学生教材",name:"《小学一年级语文(上册)》",price:12
     },
     {
      item:"初中生教材",name:"《初中一年级语文(上册)》",price:15
     },
     {
      item:"高中生教材",name:"《高中一年级语文(上册)》",price:20
     }
 ]
)
利用中括号,实现一次多条文档插入
多条文档一次性插入,利用了insert的原子性事务特征,保证所有插入文档要么插入成功,要么不成功
用变量方式插入文档
document=({name:"《C语言编程》",price:32})
db.goodsbaseinf.insert(document)
有序插入多条文档
db.goodsbaseinf.insert(
 [
     {
      _id:10,item:"小学生教材",name:"《小学一年级语文(上册)》",price:12
     },
     {
      _id:12,item:"初中生教材",name:"《初中一年级语文(上册)》",price:15
     },
     {
      _id:11,item:"高中生教材",name:"《高中一年级语文(上册)》",price:20
     }
 ],
    {ordered:true}  //有序插入设置
)
假设在 goodsdb.goodsbaseinf 集合里已经有“_id:11”的一条文档记录。那么在执行上述命令时,命
令执行将失败。也就是一条文档在ids 相同的情况下不能重复插入。
在 ordered:true 时,一条都不插 入:在 ordered:false 时,除了出错记录外,其他记录继续插入。
自定义写出错确认级别
db.goodsbaseinf.insert(
    {name:"《C语言编程》",price:32
    },
    {
    	writeConcern:{ w: "majority", wtimeout: 5000}
    } //5000毫秒
)
假设在多服务器插入该条文档命令时,因网络拥堵原因,超过 5 秒未完成命令操作。该命令将放弃执行,并返回一个出错对象内容。
简化的插入命令
db.goodsbaseinf.insertOne()
db.goodsbaseinf.insertMany()
db.collection.insertOne()和insert的区别,可以让程序员确保插入的是一条文档,而不能做多文档处理。
insertOne()和insertMany()是为偷懒准备的,可以更好地减少插入文档的出错率,并提高编程效率。

查询文档

查询集合所有文档
db.goodsbaseinf.find()
美化显示
db.goodsbaseinf.find().pretty()
等价条件查询
db.goodsbaseinf.find(
 {
  name:"《C语言编程》"
 }
)
若不想显示_id及值,并指定显示值,可以进行如下操作
db.goodsbaseinf.find(
 {
  name:"《C语言编程》"
 },
 {
  name:1,price:1,_id:0
 }
)
0或false不显示指定字段,1或true显示指定字段
嵌套文档查询
db.goodsbaseinf.find(
 {
  "baseinf.press":"清华大学出版社"
 }
)
这里通过"."号连接 baseinf 和 press,并以加双引号方式来实现指定嵌套文档的查询。
数组查询
>db.goodsbaseinf.find(
    {
		tags:["good","book","it","Program"]
    }
)  //等价查询某一数组
>db.goodsbaseinf.find(
    {
		tags:"good"
    }
)  //查询数组里的某一个值
>db.goodsbaseinf.find(
    {
		tags:{$size:4}
    }
)  //查询有4个元素的数组
查到的都是符合这一条件的文档
查找null值字段
>db.goodsbaseinf.insert(
	[
		{_id:2222,toy:null},
		{_id:1112}
	]
)
>db. goodsbaseinf.find(
	{
		_id:2222,toy:null
	}
)	//查找 nu11 值字段
>db. goodsbaseinf.find(
	{
		_id:1112,toy:{$exists:false}
	}
)	//查找的值不存在
null不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档。
如果仅仅想匹配键值为null的文档,既要检查该建的值是否为null,还要通过"$exists"条件判定键是否存在。
查找返回值游标操作
var showCursor=db.goodsbaseinf.find()
showCursor.forEach(printjson);
limit与skip方法查询
db.goodsbaseinf.find().limit(1)	//返回第一条文档
db.goodsbaseinf.find().skip(2)	//显示第3条开始的文档记录
带$in运算符的查询
>db.goodsbaseinf.find(
	{
		_id:{$in:[12,ObjectId("59322b6051baf2e220bacic2")]}
	}
)
//查找_id等于12或ObjectId("59322b6051baf2e220bac1c2")的文档记录
用 带$in运算符 实现 或(or)条件查询
通过查询操作符来查询

操作符

实例

小于

db.goodsbaseinf.find({price:{$lt:15}})

小于等于

db.goodsbaseinf.find({price:{$lte:15}})

大于

db.goodsbaseinf.find({price:{$gt:15}})

大于等于

db.goodsbaseinf.find({price:{$gte:15}})

不等于

db.goodsbaseinf.find({price:{$ne:15}})

与(and)

db.goodsbaseinf.find({name:"《小学一年级语文(上册)》",price:12}).pretty()

或(or)

db.goodsbaseinf.find({$or:[{name:"《小学一年级语文(上册)》"},{price:12}]})

正则表达式

-

或:db.goodsbaseinf.find({$or:[{ },{ }]})
$in 用于不同文档指定同一个 Key 进行或条件匹配,$or 可以指定多个 Key 或条件匹配。
正则表达式pattern选项

pattern选项

实例

/查询值的固定后一部分$/

db.goodsbaseinf.find({name:{$regex:/语文$/}})

/^查询值的固定前一部分/

db.goodsbaseinf.find({name:{$regex:/^C语言/}})

/查询值的任意部分/

db.goodsbaseinf.find({name:{$regex:/C/}})

正则表达式options选项

options选项

实例

选项说明

i

db.goodsbaseinf.find({name:{$regex:/^C语言/i}})

不区分大小写

m

db.goodsbaseinf.find({name:{$regex:/^C/,$options:"m"}})

在一个文档值存在多字符串记录的情况下(中间以\n或$分隔),以记录为单位,匹配符合的文档记录。如果文档值中不包含\n 或$,则m选项不起作用

x

db.goodsbaseinf.find({name:{$regex:/上/,$options:"x"}})

在字符串文档值中,忽略有空格的、hash 值的或带#的文档记录

s

db.goodsbaseinf.find({name:{$regex:/^.*C/,$options:"si"}})

多字符串记录情况下,使用 s 可以做到pattern 带“.*” 情况下的多字符串行匹配

区间条件查找
db.goodsbaseinf.find(
 {
  price:{$gt:3,$lt:33}
 }
)	//查询价格范围大于 3 小于 33 的值。可用于文档数值字段,也可以用于数组字段

更新文档

修改一条简单文档
db.order.update(
 {
  title:"商品购物单1"
 },
 {
 $set:{title:"商品购物单2"}
 }
)
修改某一值,用 $set 操作符
},
{
$inc:{amount:5}		//加
$mul:{amount:2}		//乘
$rename:{"titlss":"title"}		//修改错误字段的键名,在键名大量出错的情况下尤其有用
$unset:{unit:"元"}
$min:{amount:50}	//将$min 给出的值与当前文档字段值进行比较,当给定值较小时则修改当前文档值为给定值
$max:{amount:50.5}	//将$max 给出的值与当前文档字段值进行比较,当给定值较大时则修改当前文档值为给定值
}
用 ISODate 更新当前文档时间字段的值
db.order.insert(
 {
  _id:11,
  lasttime:ISODate("2017-06-03 13:58:55")
 }
)

db.order.update(
 {
  _id:11
 },
 {
  lasttime:ISODate("2017-07-03 13:58:55")
 }
)
修改一条文档里的数组和嵌套数组
db.order.update(
 {
  _id:12
 },
 {
  $set:{
  	"detail.1":{name:"大米",price:40},		//修改数组值
  	"overview.address":"天津市和平区成都道0号"	//修改子文档
  }
 }
)
对文档里的子文档值进行修改,可以通过主Key.SubKey 的组合来实现指定子文档字段对应值的修改;
对于数组值的修改,可以通过 KeyNumber 的方式指定修改数组值,Number 从 0,1…开始,对应数组的第一个下标、第二个下标……
引用数组或嵌入文档对象时,都需要加""号,如"detail.1""overview.address",中间用点号隔离。
多文档修改

采用multi选项

db.order.update(
 {
  "detail.name":"面粉",
  "detail.price":{$lte:30}		//find()查询条件操作符,可以用在update操作条件上
 },
    
 {
  $set:{
   "detail.1":{name:"面粉",price:40}
  }
 },
    
 {
  multi:true		//修改所有面粉价格小于等于30的文档记录,把面粉价格改为40
 }
)
增加文档字段
bd.order.update(
 {
  _id:10
 },
 
 {
  $set:{
   "detail.0":{name:"西瓜",price:10},
   unit:"元"
  }
 },
 
 {
  upsert:true
 }
)
Update 命令在特定情况下,可以增加文档的字段,甚至实现 insert 命令功能。
这个特定条件是要修改的文档没有要修改的字段,而且 update 命令带 upsert 选项。
自定义写确认级别
},
{
 writeConcern:{w: "majority",wtimeout:5000}
}
当 update 命令在 5 秒内没有执行完成时,取消该命令操作,并返回错误值
collation参数使用
collation: {
	locale:<string>,	//若要使用 collation 参数,locale 是必选的,其他是可选
	caseLevel:<boolean>,
	caseFirst:<string>,
	strength:<int>,
	numericOrdering:<boolean>,
	alternate:<string>,
	maxVariable:<string>,
	backwards:<boolean>,
	normalization <Boolean>
}
参数说明:更新规则参数允许程序员为字符串比较指定特定国家语言的规则,如字母的大小写、重音标记等。

删除文档

db.collection.remove

删除一个集合里所有文档记录
db.tests.remove({})		//删除一个集合里所有文档记录,不会删除索引
若要删除整个集合,采用db.tests.drop()方法效率更高,它会把整个集合和索引一起删除。
删除符合条件的所有文档集合
db.tests.remove(
 {
  price:{$gt:3}
 }
)		//删除价格大于3的所有文档记录
自定义写出错确认级别
},
{
 writeConcern:{w: "majority",wtimeout:5000}
}
删除价格小于 3 的所有文档记录,当时间超过 5 秒时,或者副本集大多数已完成该命令执行时,就中断该命令的执行,返回该命令的操作结果
删除满足条件的单个文档记录
db.test.remove(
 {
  prive:{$gt:3}
 },
 {
  justOne:true
 }
)		//删除价格大于3的第一个文档记录
删除含特殊语言符号的文档记录
},
{
 cllation:{locale:"fr",strength:1}
}		//只对法文的基本字母进行比较,忽略读音符和大小写等

索引

基于集合建立索引(Index),目的是为了提高查询速度。

默认情况下,在建立集合的同时,MongoDB 数据库自动为集合_id 建立唯一索引,可 以避免重复插入同一id 值的文档记录。

单一字段(键)索引
对单一键建立索引
db.books.createIndex(
 {
  name:1
 }
)		//在books集合中针对name字段创建一个升序排列的索引
对一个集合文档的键建立索引,key为键名,n=1为升序,n=-1为降序
嵌套文档单字段索引
db.books.createIndex(
 {
  "tags.press":1
 }
)
字段值唯一索引
db.books.createIndex(
 {
  name:1
 },
 {
  unique:true
 }
)
name的 必须是唯一的,不能有重复值出现,否组MongoDB将新插入的重复文档予以拒绝。
没有{unique:true}参数选项的情况下,索引方法允许存在字段值重复的多文档记录。
在集合的同一个键上不能重复建立单一索引;若已经建立了索引,再在同一个 Key 上建立索引,将给予出错提示。
多字段索引
建立多字段索引
db.books.createIndex(
 {
  price:1,color:-1
 }
)		//对两个字段建立索引

db.books.find({},{_id:0}).sort({price:1,color:-1})		//用sort排序查询
先用createIndex命令建立price、color多键组合索引
然后用 find() 查找文档记录
对查找出来的文档记录结果用 sort({price:1,color:-1}) 先用做 price 升序排序,在 price 价格一样的情况下,再对 price 相同记录做 color 降序排序
多字段唯一索引
db.createIndex(
 {
  name:1,price:1
 },
 {
  unique:true
 }
)
只要name和price组合起来的值保持唯一性。
文本索引

在集合中,为文本字段内容的文档建立文本索引。

基本文本索引
db.books.createIndex(
 {
  name:"text"
 }
)		//为name建立文本索引
指定权重文本索引
db.books.createIndex(
 {
  name:"text",
  price:"text"
 },
 {
  weights: {name:10},		//为name指定索引权重
  name:"TextIndex"
 }							//默认情况下,price权重为1
)
通配符文本索引
db.books.createIndex({ "$**":"text"})
为指定集合中的所有字符串内容进行搜索提供通配索引,这在高度非结构化的文档里比较有用。
哈希索引
db.books.createIndex({_id:"hashed"})
key为含有哈希值的键
hashed索引不支持多字段索引
会把浮点数的小数部分自动去掉
不支持唯一索引
ensureIndex()索引
用ensureIndex命令建立索引
db.books.ensureIndex({_id:"hashed"})
与索引相关的其他方法
>db.collection.dropIndex(index)		//移除集合指定的索引功能。index 参数为指定需要删除的集合索引名,可用 getindexes()函数获取集合的所有索引名称。
>db.collection.dropIndexes()		//移除一个集合的所有索引功能。
>db.collection.getIndexes()		//返回一个指定集合的现有索引描述信息的文档数组。
>db.collection.reIndex()		//删除指定集合上所有索引,并重新构建所有现有索引。在具有大量数据集合的情况下,该操作将大量消耗服务器的运行资源,引起运行性能急剧下降等问题的发生。
>db.collection.totalIndexSize()		//提供指定集合索引大小的报告信息。

聚合

聚合(Aggregation)为集合文档数据提供各种处理数据方法,并返回计算结果。

聚合管道方法
db.Sale_detail.insert(
 [
  {goodsid:"1001",amount:2,price:10.2,ok:false},
  {goodsid:"1001",amount:3,price:14.8,ok:false},
  {goodsid:"1002",amount:10,price:50,ok:false},
  {goodsid:"1002",amount:2,price:10,ok:true}
 ]
)

db.Sale_detail.aggregate(
 [
  {
   $match:{ok:false}
  },						//查找条件
  {
   $group:{
   	_id:"$goodsid",
   	total:{$sum:"$amount"}
   }							//按goodsid分类统计amount字段的总数量
  }
 ]
)

统计结果:

_id:必须指定唯一性字符,不能改为其他名称的字段
goodsid:分类字段名
total:统计结果字段名,可以是任意符合起名规则的新名称
$sum:求和操作符号
$amount:求和字段,必须加上双引号
除了$sum,还有$avg、 $min、$max、$push、$addToSet、$first、$last 操作符等
map-reduce方法
>var mrr=db.Sale_detail.mapReduce(
	function(){		//map 自定义函数
			emit(this.goodsid,this.amount)
		},
	function(key,values) {		//Reduce 自定义函数
			return Array.sum(values)
		},
	{
	query:{ok:false}, 
	out:{replace:"result"}
	}
	
>db[mrr.result].find()
单一目标聚合方法
db.collection_name.count(query,options)
>db.Sale_detail.count({ok:false})			//统计符合条件的记录数
>db.Sale_detail.count({ok:false},{skip:1})	//从第二条开始统计符合条件的记录数
>db.Sale_detail.count({ok:false},{limit:3})	//限制要计数的文档的最大数目
db.collection_name.distinct(<key>,query,option)

统计指定键的不同值并返回不同值

db.Sale_detail.distinct("goodsid")		//结果["1001","1002"]
单一目标聚合方法,可以直接在 find()后加点使用。
如 goodsdb.Sale_detail.find({ok:false}).count()
goodsdb.Sale_ detail.find({ok:false}).count().skip(1)
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值