Mongo入门-2-基本操作

创建数据库

use + 数据库名称

use会创建一个数据库,如果这个数据库存在,那么返回这个数据库

示例
创建一个数据库skdb

use skdb

使用db命令查看当前选定的数据库

db

使用show dbs命令来检查数据库列表

show dbs

插入新的文档到集合中

db.student.insert{
stuid : 1,
stuname : "xxx"
}

删除数据库

db.dropDatabase

范例

sue sdkb
db.dropDatabase()

插入文档

若不存在,插入新文档时会自动创建一个新的集合,再插入.

db.collection.insertOne():向指定的集合插入一条数据
db.collection.insertMany():向指定的集合中插入多条数据
db.users.insertOne(
{
	name:"sue",
	age:22,
	status:"xxx"
}
)

向users插入多条文档

db.users.insertMany(
[{
name:"zzxb",
age:18,
status:"xxx"
},
{
name:"ilyj",
age:38,
status:"stop"
}
]
)

更新文档

db.collection.update(
<query>,
<update>,
{
	upsert:<boolean>,
	multi:<boolean>,
	writeConcern:<documnet>
}
)

参数说明:

  • query:update的查询条件,类似sql update查询内where后面的
  • update:update的对象和一些更新的操作符号
  • upsert:可选 若不存在update的记录,是否插入objNew,true为插入,默认为false,不插入
  • multi:可选,只更新找到的第一条记录,true:把按条件查出来的多条记录全部更新
  • writeConcern:可选 抛出异常的级别

3.2版本开始 MongoDB提供以下更新集合文档的方法

db.collention.updateOne()
db.collection.updateMany()

范例
将name为zzxb的文档,更新年龄为40

db.user.update(
{"name":"zzxb"},
{$set:{"age":40}}
)

将年龄小于30的文档,更新状态为stop

db.users.update(
{"age":{$lt:30},
{$set:{"status":"stop"}}
}
)

大于小于

  • lt : 小于
  • gt: 大于
  • lte : 小于等于
  • gte : 大于等于
  • ne: 不等于

save语法
save()方法通过传入的文档来替换已有的文档

db.collection.save(
<document>,
{
writeConcern:<document>
}
)
  • document:文档数据
  • writeConcern:可选的,抛出异常的级别

替换id为5a67ea03fd6b999d262bae2c的文文档内容

db.users.save({
	_id:ObjectId("5a67..."),
	name:"myzzxb",
	age:28,
	status:"starting"
})

修改器
通常文档只会有一部分要更细,使用原子性的更新,指定文档的某些字段进行更新
更新修改器是钟特殊的键.用来指定复杂的更新操作:修改,增加 删除,还可能是操作数据或内嵌文档

$inc:修改器⽤用来增加已有键的值,或者该键不存在那就创建⼀一个

新建集合


  db.fangwencount.insert(
  [
  {
      url:"www.163.com",
      pageviews:52
  },
  {
      url:"www.sina.com.cn",
      pageviews:52
} ]
)

使用$inc修改访问次数

 db.fangwencount.update(
  {url:"www.sina.com.cn"},{$inc:{pageviews:2}}
  )

$inc键的值必须为数

$set指定一个字段的值 如果不存在那么创建

db.students.insert(
  {
name:"zzxb", age:19, sex:"男"
} )

添加学生爱好

db.sutdent.update(
{
	name:''zzxb''
},{
	$set:{aihao:"football"}
}
)

再添加一个爱好

db.student.update(
{
	name:"zzxb"
},
{
	$set:{aihao:"football","basletball"}
}
)

$unset可以删除字段
删除aihao的键值

bd.sutdent.update(
{
	name:"zzxb"
},
{
	$unset:{aihao:null}
}
)

数组修改器

数组是很有用的数据结构
可通过索引进行引用的列表
还可以作为数据集采用

添加元素
若数组存在
$push会向数组末尾添加一个元素

没有数组就创建一个新的数组

新增集合

db.blog.posts.insert(
	{
		title:"mongdb操作⼿手册",
		content:"这是⼀一份mongdb操作⼿手册",
		addtime:new Date()
	}
)

$push添加元素

db.blog.post.updateOne(
{
	title:"mongodb操作手册"
},
{
	$push:{
		comment:{
			name:"ifeng",
			email:"[email protected]",
			addtime:new Date()
		}
	}
}
)

再次添加评论

db.blog.posts.updateOne(
{
	title:"mongo操作手册"
},
{
	$push:{
		comment:{
			name:"asdfj",
			email:"[email protected]",
			addtime:new Date()
		}
	}
}
)

在这里插入图片描述
$each,可以通过一次 $push操作添加多个值
添加一个新的likes字段,用于记录点赞的人

db.blog.posts.updateOne(
{
    title:"mongodb操作手册"
},
{
    $push:{
        $each:[{name:"aa"},{name:"bb"},{name:"cc"}]
    }
}
)

$addToSet向数组添加不重复的元素
向like字段添加重复的元素

db.blog.posts.update(
{
    title:"mongo操作手册"
},{
    $addToSet:{
        likes:{
            name:"cc"
        }
    }
}
)

$pop $pull $pullAll
$pop指定数组删除的值 1:最后一个 -1:第一个

{$pop:{name:1}}

$pull删除被指定的值

{$pull:{name:"cc"}}

$pullAll:一次性删除多个指定的值

{$pullAll:{name:["js","JAVA"}}

使用占位符$操作嵌套文档

db.blogs.posts.update(
{_id:ObjectId("aksjdf;lka","comment.uname":"zzxb")},
{$set:{"comment.$.cotent":"ok"}}
)

注意:目前mongo不支持多个$

updataMany()

更新文档
findAndModify()能够在⼀个操作中返回匹配结果并且进⾏更新。

删除文档

语法1
db.collection.deleteOne(
 <filter>,
 {
 writeConcern: <document>,
 collation: <document>
 }
)

语法2
db.collection.deleteMany(
 <filter>,
 {
 writeConcern: <document>,
 collation: <document>
 }
)

参数说明:
filter : 条件
writeConcern :可选,抛出异常的级别。
collation:可选,排序⽅式⾃定义

删除ifeng用户

db.users.deleteOne(
{name:"ifeng"}
)

查询⽂档
插入模拟的数据

查询语法

db.collection.find(query,projection)

参数说明:
query :可选,使⽤查询操作符指定查询条件
projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该
参数即可(默认省略)。

查询所有文档 并且显示所有字段

db.users.find()

查询全部文档 并且显示name字段

db.users.find({},{name:1})

_id键默认返回 需要指定——id:0才会隐藏
db.userts.fidn({},{_id:0,name:1})

条件操作符

条件操作符⽤于⽐较两个表达式并从mongoDB集合中获取数据。
通过下表可以更好的理解 MongoDB 的条件操作符语句:
在这里插入图片描述
查询年龄等于30的用户

db.users.find(
{age:30}
)

查询年龄大于28的用户

db.users.find(
{age:{$ge:28}}
)

查询年龄大于等于30岁的用户

db.users.find(
{age:{$gte:30}}
)

And条件

语法:

db.collection.find({key1:value1,key2:valuse2})

查询年龄大于30 状态位ok的用户

db.users.find(
{
	age:{$gt:30},
	status:"ok"
}
)

OR条件

db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)

查询年龄大于30 或者状态时stop的用户

db.users.fidn(
{
	$or:[
	{age:{$gte:30}},
	{status:"stop"}
	]
}
)

查询出指定键

db.[集合名].find({条件},{键指定})
db.students.find({},{_id:0,stuname:1,city:1})

查询出年龄在25到27岁之间的学生

db.student.find({age:{$get25,$lte:27}})

包含 不包含($ in/$sin)
查询出所有(bu)是济南或者烟台的学生信息

db.mystu.find(
{
	city:{$(n)in:["jinan","yantia"]}
}
)

OR查询
查询所有高考成绩大约79或者Hadoop成绩大于80的学生信息

db.mystu.find(
$or:{
	{java:{$gt:79}},
	{hadoop:{$gt:80}}
}
)

把所有济南学生信息添加sex字段 并设置位man

db.mystu.updateMany(
{city:"jinan"},
{$set:{sex:"man"}}
)

模糊查询 正则表达式

//查询出名字中含有zz的信息
db.mystu.find(
{stuname:/zz/}
)

db.mystu.find(
{stuname:{$regex:"zz"}}
)


//不区分大小写
db.mystu.find(
{stuname:/zz/i}
)

db.mystu.find(
{stuname:{$regex:"zz",$options:"$i"}}
)

$regex与正则表达式对象的区别:

KaTeX parse error: Expected '}', got 'EOF' at end of input: …达式对象,例如:{name:{in:[joei,jack}}
在使⽤隐式的 a n d 使 and操作符中,只能使⽤ regex,例如:{name:{$regex:^joi, KaTeX parse error: Expected 'EOF', got '}' at position 13: nin:['john']}̲} 当option选项中包含X…regex,例如:{name:{$regex:m.line,
$options:“si”}}

not使⽤
查询出所有名字不含有“zz”的学⽣信息

db.mystu.find(
{stuname:{$not:/zz/}}
)

注意$ not不能与$ regex同时使⽤
数组查询$ all和$ index应⽤
查询出拥有MONGODB和html书籍的学⽣

db.mystu.find(
{books:{$all:["html","MONGODB"]}}
)

查询出拥有第⼆本书是java书籍的学⽣

db.mystu.find(
{"books.1":"java"}
)

数组⻓度 $ size
查询出拥有四本书籍的所有学⽣信息

db.mystu.find(
{books:{$size:4}}
)

查询出拥有⼤于三本书籍的所有学⽣信息

db.mystu.find(
{books:{$size:{$gt:3}}}
)

⽆法实现, $ size⽆法与$ gt, $lt等⽐较符同时使⽤
1.新增⼀个书籍数量的字段

db.mystu.updateMany({},{$set:{num:4}})

2.给zzxb学⽣,新增⼀本regex书籍

db.mystu.update(
{stuname:"zzxb"},
{$push:{books:"regex"},
$inc:{num:1}}
)

3.查询⼤于4本书的学⽣

db.mystu.find({num:{$gt:4}})
$slice

查询出zzxb学⽣,拥有的第2到第4本书

db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: [ 1, 4 ] } }
)

查询出zzxb学⽣,拥有的最后⼀本书

db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: -1 } }
)

⽂档查询
为zzxb,添加新的学习简历集合

var zzxb = [
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}
]

插⼊

db.students.update({stuname:"zzxb"},
{$set:{school:[
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}]
}});

查询在109中学,上过学的学⽣
匹配查询:

db.students.find({school:{school:"109⾼中"}});

⽆法查询出结果,必须要完全匹配

db.students.find({school:{school:"109⾼中",score:"A+"}});

点“.”定位器:

db.students.find({"school.school":"109⾼中"})

查询出在140初中且成绩为A的学⽣

db.students.find(
{"school.school":"140初中","school.score":"A"})

查询错误,查出不符合要求的记录

使⽤用$elemMatch查询⼦子⽂文档

db.students.find({school:{$elemMatch:{school:"140初中",score:"A"}}});
db.students.find({school:{$elemMatch:{school:"140初中"}}});

where复杂查询

JS字符串串⽅方式:

  db.students.find({$where:"this.age > 25"});

Js函数⽅方式

  db.students.find({$where:
      function() {
          if (this.age > 25 && this.age < 30){
              return this;
} }
});

复杂:

  db.students.find({$where:function (){
      if(this.city == 'jinan'){
       for(var i = 0;i < this.books.length;i++){
              var java = this.books[i];
              if(java == 'oracle'){
                  return this;
} }
} }});

分⻚页与排序
limit、skip
查询出前五条记录

  db.students.find({},{stuname:1}).limit(5);

查出5-10条记录 db.students.find({},

{stuname:1}).limit(5).skip(5);

sort排序 倒序:

  db.students.find({},{stuname:1,age:1}).limit(5).skip(5).sort({age:-1});

正序:

 db.students.find({},
 {stuname:1,age:1}).limit(5).skip(5).sort({age:1});

游标

使用游标

var stu = db.student.find();
while(stu.hasNext()){
	var. obj = stu.next();
	print(obj.stuname);	
}

游标销毁条件

  • 客户端主动销毁
  • 游标到底
  • ⼗十分钟内游标没使⽤用,⾃自动销毁

索引

创建索引

db.books.ensureIndex({number:1});

索引使⽤用需要注意的地⽅方

  1. 创建索引:1是正序索引,-1是倒序索引
  2. 索引的创建在提⾼高查询性能的同时会影响插⼊入的性能。对于经常查询少插⼊入的集合可以考虑⽤用
    索引。
  3. 符合索引要注意索引的先后顺序
  4. 每个键全建⽴立索引不不⼀一定就能提⾼高性能。

创建索引同时指定索引名字

 db.books.ensureIndex({number:-1},{name:"ix_number"});

唯⼀一索引

     db.books.ensureIndex({bookname:1},{unique:true});

Hint
如何强制查询使⽤用指定的索引

 db.books.find({bookname:"bookname1"}).hint({bookname:1});

explain
查看本次查询使⽤用索引情况和查询数据的状况信息

db.books.find({bookname:"book1"}).explain(); db.books.find({bookname:"book23456"}).explain("executionStats");//version 3.0以 上

查看所有索引

db.system.indexses.find(); db.books.getIndexes();//version 3.0以上

后台执⾏行行创建索引

 db.books.ensureIndex({bookname:1},{background:true});

删除索引

db.runCommand({dropindexes:"books",index:"ix_number"});

空间索引

创建2D索引

db.maps.ensureIndex({gis:"2d"},{min:-1,max:201});
 
 默认会创建⼀一个【-180,180】之间的2D索引

案例例1
查询点(70,180)最近的三个点

db.maps.find({gis:{$near:[70,180]}}).limit(3);

案例例2
查询以点 (50,50)和点(190,190)为对⻆角线的正⽅方形中的所有点

  db.maps.find({gis:{$within:{$box:[[50,50],[190,190]]}}});

案例例3 查询以点(50,50)为圆⼼心,半径为100规则下的圆下的所有点

 db.maps.find({gis:{$within:{$center:[[50,50],150]}}});

备份与恢复
备份:

 mongodump -h localhost -d skmongo -o /mydata

恢复:

mongorestore -h localhost:27017 -d skmongo /yundata/backup/mongo/skmongo
发布了154 篇原创文章 · 获赞 605 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/weixin_39381833/article/details/89221189
今日推荐