MongoDB使用教程

一、基本概念

一)数据库(database)

数据库是一个仓库,在仓库中可以存放集合

二)集合(collection)

集合类似于数组,在集合中可以存放文档

三)文档(document)

文档是数据库中的最小单位,存储和操作的内容都是文档

在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。

二、基本指令

# 显示有多少个数据库
show dbs 、show databases
# 进入到指定数据库中
use 数据库名
# 当前所处的数据库
db
# 显示数据库中所有的集合
show collections

三、增删改查(CRUD)操作

插入文档

  • db.<collection>.insert(doc)
  • db.<collection>.insertOne(doc) 只能插入一个文档
  • db.<collection>.insertMany(doc) 必须传多个,用数组阔起来
# 例:向 stus 集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"})

查询当前集合中所有的文档

  • db.<collection>.find() 返回集合中所有文档(返回的是一个数组)
  • db.<collection>.find({}) 用来查询集合中所有符合条件的文档(返回的是一个数组)
  • db.<collection>.findOne() 用来查询集合中符合条件的第一个文档(返回的是一个对象)
  • db.<collection>.find().count() 查询符合条件的个数
db.stus.find({name:"dfs"})   # 查询 name 为 dfs 的文档
db.user.find({}, {name: 1, age: 1});   # 查询指定列 name、age 数据(使用了投影);
db.user.find({age: {$gt: 25}}, {name: 1, age: 1});  # 查询指定列 name、age 数据, 并且age > 25;
db.user.find({name: /^mongo/});  # 查询 name 中以 mongo 开头的数据
db.user.find({name: /mongo/});  # 查询 name 中包含 mongo 的数据,多用于模糊查询搜索

通过内嵌文档的属性值进行查询

# 下列例子中,hobby就是内嵌文档
{
	name:'liu',
	hobby:{
		movies:['movie1','movie2'],
		cities:['zhuhai','chengdu']
	}
}
db.users.find({"hobby.movies":'movie1'}) //注意:此时查询的属性名必须加上引号

查询操作符的使用

$gt 大于,$gte 大于等于,$lt 小于,$lte 小于等于,$ne 不等于,$eq 等于,$or 或者

db.users.find({num:{$gt:200}}) # 大于200
db.users.find({num:{$gt:200,$lt:300}}) # 大于200小于300
db.users.find({$or:[{num:{$gt:300}}, {num:{$lt:200}}]}) # 大于300或小于200

分页查询

  • db.users.find().skip(页码 - 1 * 每页显示的条数).limit(每页显示的条数)
db.users.find().limit(10) # 前10条数据
db.users.find().skip(50).limit(10) # 跳过前50条数据,即查询的是第61-70条数据,即第6页的数据

排序

  • 注意:skip,limit,sort可以以任意的顺序调用,最终的结果都是先调sort,再调skip,最后调limit
db.emp.find().sort({sal:1})   # 1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1})  # 先按照sal升序排列,如果遇到相同的sal,则按empno降序排列

投影,即只过滤出自己想要的字段

# 在匹配到的文档中只显示name和age字段
db.stus.find({name:'孙悟空'},{_id:0,name:1,age:1})

修改文档

  • db.<collection>.update(查询条件, 新对象) 默认情况下只改一个
  • db.<collection>.updateMany(查询条件, 新对象) 同时修改多个符合条件的文档
  • db.<collection>.updateOne(查询条件, 新对象) 只修改一个符合条件的文档
  • db.<collection>.replaceOne 替换一个文档
# $set 修改文档的指定属性,没有就增加
db.\<collection>.update({"name":"沙和尚"},{$set:{gender:"男"}})   # 只修改一个匹配的
db.\<collection>.update({"name":"沙和尚"},{$set:{gender:"男"}},{multi: true})  # 修改多个匹配的
# $unset 删除文档的指定属性
db.\<collection>.update({"name":"沙和尚"},{$unset:{gender:"男"}})
# 其它
db.user.update({"name":"小明"},{"name":"大明","age":16});         # 查找name为小明的用户的信息进行完整替换,注意没有$set了;
db.user.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);  # 查找name为Lisi的用户,将其年龄增加50岁;

删除文档

  • db.<collection>.remove() 根据条件删除,注意:若只传入一个空集合,则会删除所有数据
  • db.<collection>.deleteOne() 删除一个
  • db.<collection>.deleteMany() 删除多个

remove 和 delete 的区别:remove 函数返回的删除的结果的 WriteResult,而 delete 函数返回的是 bson 格式。

db.stus.remove({_id:"hello"})
db.user.remove({"age":"32"},{justOne:true})  # 删除年龄为32的一个用户

去重

db.user.distinct("name");  # 查询当前集合中的某列去重后的数据

文档间的关系

一对多

# 用户与订单:
db.users.insert([{_id:100,username:'liu1'},{_id:101,username:'liu2'}])
db.orders.insert([{list:['apple','banana'],user_id:100},{list:['apple','banana2'],user_id:100},{list:['apple'],user_id:101}])
# 查询liu1的所有订单,首先获取liu1的id,根据id从订单集合中查询对应的订单
var user_id = db.users.findOne({username:'liu1'})._id;
db.orders.find({user_id:user_id});

多对多

#老师与学生
db.teachers.insert([{_id:100,name:'liu1'},{_id:101,name:'liu2'},{_id:102,name:'liu3'}])
db.students.insert([{_id:1000,name:'xiao',tech_ids:[100,101]},{_id:1001,name:'xiao2',tech_ids:[102]}])
posted @ 2023-10-01 18:19  yifanSJ  阅读(68)  评论(0编辑  收藏  举报