开启MongoDB基础操作:
(1)首先打开两个cmd,
(2)第一个cmd先启动服务器mongod --path D:\data\db –port 20717,
(3)第二个cmd再连接服务器mongo,出现>,连接成功!
则在该cmd窗口(第二个cmd)进行操作
1、MongoDB_插入文档
db.<collection>.insert() 向集合中插入一个或多个文档
插入一个: db.stus.insert({name:"xk",age:25,gender:"boy"})
插入多个: db.stus.insert([{name:"xk1",age:251,gender:"boy1"},{name:"xk2",age:252,gender:"boy2"}]) 列表里面套集合
【此时显示集合中的文档】
注:当向集合中插入文档时,若没有指定_id属性,则数据库会自动为文档添加_id属性,该属性用来作为文档的唯一标识
_id可以自己指定,若我们制定了数据库就不会再添加了,但自己指定_id 也必须确保它的一致性 【通常不自己指定】
自己指定 _id插入数据 db.stus.insert({_id:"hello",name:"xk3",age:253,gender:"boy3"})
细分:
db.<collection>.insertOne() 向集合中插入一个文档
db.<collection>.insertMany() 向集合中插入多个文档
2、MongoDB_查询文档
db.<collection>.find() find()用来查询集合中所有符合条件的文档 find()可以接收一个对象作为条件参数
db.<collection>.find() 和db.<collection>.find({ }) 表示查询集合中所有的文档 {属性:值} 查询属性是指定值的文档
【找出_id为”hello”的文档】
【下面一个是“并列关系”】
find()返回的是一个数组 db.<collection>.find({ }).count() 查询所有结果的数量
db.<collection>.findOne() 用来查询集合中符合条件的第一个文档 findOne()返回的是一个文档对象
【文档对象可以直接拿到属性值】
3、MongoDB_修改文档
db.<collection>.update(查询条件,新对象) update()默认情况下会使用新对象来替换旧对象
【这种有风险】
db.<collection>.update(查询条件,{$set:{修改条件}}) 这种只会修改“修改条件”中出现的属性,不会进行替换
【这种没有风险】
使用$unset来删除文档中指定的属性
注:update默认只修改一个,相当于下述的updateOne()
db.<collection>.updateMany() 同时修改多个符合条件的文档
db.<collection>.updateOne() 修改一个符合条件的文档
db.<collection>.replaceOne() 【共患难同伴】
4、MongoDB_删除文档
db<collection>.remove() 可以删除一个或多个 很久条件来删除文档,传递条件的方式和find()一样
remove() 会删除符合条件的所有文档,有几个删几个,若第二个参数传递一个true,则只会删除一个
db.<collection>.deleteOne()只能删除一个 db.<collection>.deleteMany()删除多个
db.<collection>.remove({ }) 清空集合
db.<collection>.drop() 删除集合
db.dropDatabase() 删除数据库
【注:一般数据库中的数据都不会删除,所以删除的方法很少调用】
【一般都会在数据中添加一个属性,来表示数据是否被删除】【所以查找的时候,一般都是按条件查找】
5、练习1(简单)
(1)向username为sunwukong的文档中,添加hobby:{cities:[“beijing”,”shanghai”,”shenzhen”],movies:[“sanguo”,”hero”]}
发现:MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档为:内嵌文档
(2)查询喜欢hero的文档 使用:db.users.find({hobby.movies:”hero”})
发现:MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
(3)向username为sunwukong中添加一个新电影shuihu
发现:$push向数组中添加一个新的元素 【可以重复】 $addToSet向数组中添加一个新的元素 【不可以重复】
(4)删除喜欢beijing的用户
【对于内嵌文档的使用:属性需要使用引号“”】
6、练习(中)
(1)考虑效率:向numbers中插入20000条数据
花费7.2s
清空集合,重新提高效率
提高效率:花费0.4s
(2)查询numbers中num为500的文档 db.numbers.find({num:500})
(3)查询numbers中num大于5000的文档 db.numbers.find({num:{$gt:5000}})
(4)查询numbers中num小于30的文档 db.numbers.find({num:{$lt:30}})
(5)查询numbers中num大于40小于50的文档 db.numbers.find({num:{$gt:40,$lt:50}})
(6)查询numbers集合中的前10条数据 db.numbers.find().limit(10)
本数据的特点可以使用: db.numbers.find({num:{$lte:10}})
(7)查询numbers集合中的第11条到20条数据 db.numbers.find().skip(10).limit(10) 注:skip()用于跳过指定数量的数据
7、练习(难) 文档之间的关系 【用的最多的是“一对多”】
(1)一对一(one to one)
比如:夫妻(一个丈夫 对应 一个妻子) 在MongoDB中可以通过内嵌文档的形式来体现一对一的关系,如下:
db.WifeandHusband.insert([{name:"潘金莲",husband:{name:"武大郎"}},{name:"黄蓉",husband:{name:"郭靖"}}])])
(2)一对多(one to many)/多对一(many to one)
比如:父母-孩子 用户-订单 也可以通过内嵌文档的形式来映射一对多的关系,如下(用户-订单):
查找用户swk的订单:
- 首先找到swk的_id,将其赋值为user_id var user_id=db.users.findOne({username:"swk"})._id
- 根据user_id查找相应的订单 db.orders.find({user_id:user_id})
(3)多对多(many to many)
比如:分类-商品 老师-学生 也可以通过内嵌文档的形式来映射一对多的关系,如下(老师-学生):
【两个学生】
db.stus.find() 查询结果为: