mongoDB学习笔记

79 阅读5分钟

一、mongoDB与mysql概念对比

mongoDBmysql
数据库(DataBase数据库(DataBase
数据集合(Collection数据表(Table
数据文档(Document数据行(Row
字段(Field列/字段(Column
索引(Index索引(Index

二、mongoDB数据库操作

1、 使用某个数据库(没有则创建)
use test1
2、 查询当前使用的数据库
db
3、 查询所有数据库
show dbs
4、删除数据库
db.dropDatabase()

三、mongoDB集合操作

1、显式创建学生集合
db.createCollection("student")
2、隐式创建一个学生集合(往不存在的集合里面直接插入数据)
db.student.insert({"name":"小强"})
3、删除学生集合
db.student.drop()

四、mongoDB文档操作

1、新增文档
(1)、 向集合插入单条数据(即文档)
db.student.insertOne({"name":"小红"})

注意这里的insertOne区分大小写,单条数据用{}包裹,用[]包裹会插入失败,并报错,如下

db.student.insertOne([{"name":"小红"},{"name":"小强"}])
​
> [Error] Error: collection.insertOne requires a single document
at line 1, column 1
(2)、向集合批量插入多条数据(即文档)
db.student.insertMany([{"name":"小红"},{"name":"小强"}])

注意这里的insertMany区分大小写,多条数据用[]包裹,用{}包裹会插入失败,并报错,如下

db.student.insertMany({"name":"小红"})
> [Error] Error: collection.insertMany requires list of documents
at line 1, column 1
(3)、向集合中添加多条或者单条数据
db.student.insert({"name":"小强"})
db.student.insert([{"name":"小红"},{"name":"小强"}])

注意这里单条用{}包裹,多条用[]

此外这两种写法是等同的。

db.student.insert({name:"小强"})
db.student.insert({"name":"小强"})

在MongoDB中,通常建议使用双引号来包裹文档中的键,因为MongoDB使用BSON(Binary JSON)格式来存储数据,而BSON要求所有的键名都是字符串,并且需要用双引号包裹。如果你省略了双引号,MongoDB shell通常会尝试解析并自动添加双引号。

2、删除文档

先清空集合student,然后往集合中插入一批文档

db.student.insert([{"name":"小强"},{"name":"小明","sex":"男","age":12},{"name":"小红","sex":"女","age":11,"hobby":"买买买"},{"name":"小刚","sex":"男","age":9},{"_id":5,"name":"小华","sex":"男","age":7},])

插入结果如下 image.png 可以看到前4条数据并没有手动塞_id的值,但是mongoDB会自动生成一个类似于雪花ID的ObjectId值。

(1)、删除学生集合中的所有数据(不写条件即可)
db.student.remove({});
(2)、 根据指定条件删除集合中的数据
db.student.remove({"sex":"男"});

另外如果这里如果是根据_id作为条件来删除的话,自己手动塞入的id可以使用以下删除

db.student.remove({_id:5});

但是如果是使用mongodb生成的id作为条件来删除的话,需要使用函数ObjectId函数来包装_id 的值

db.student.remove({_id:ObjectId("65e186cbc579000024002312")});
(3)、根据条件删除单条数据(有多条数据满足条件时,只会删第一条)
db.student.deleteOne({{"sex":"男"});
(4)、根据条件删除多条数据(满足条件的全部删除)
db.student.deleteMany({"sex":"男"});
(5)、根据条件删除满足条件的第一条数据,并返回删除后的数据
db.student.findOneAndDelete({"sex":"男"});
3、修改文档
(1)、update函数
// 只修改第一条,将第一个男性的年龄变成10岁
db.student.updateOne({"sex":"男"}, {$set:{"age":10}});
// 批量修改,将所有的男性的年龄变成11岁
db.student.updateMany({"sex":"男"}, {$set:{"age":11}});
​
// 只修改第一条,将第一个男性的年龄变成10岁且爱好变成看电影,等价于updateOne
db.student.update({"sex":"男"}, {$set:{"age":10,"hobby":"看电影"}})
// 批量修改,将所有的男性的年龄变成10岁且爱好变成看电影,updateMany
db.student.update({"sex":"男"}, {$set:{"age":10,"hobby":"看电影"}},{multi:true})

其中update({},{},{})函数中一共用三个参数,第一个是查询条件,第二个是update的对象和一些更新的操作符,第三个是可选的。

第三个对象中又包含upsert ,multi ,writeConcern

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
(2)、replaceOne函数
db.student.replaceOne({_id:5}, {name:"李华"});

在MongoDB中,replaceOneupdateOne都是用于修改集合中文档的方法,但它们的操作方式和结果有所不同。

  • 操作方式:replaceOne操作会替换整个匹配的文档,而updateOne则只会修改匹配文档中的指定字段。
  • 结果影响:使用replaceOne时,如果新文档中没有包含旧文档中的某些字段,那么这些字段将会丢失。相反,updateOne则可以在添加新字段的同时保留旧文档中的字段。
(3)、save函数
db.student.save({_id:6,name:"李华2"});

save() 函数通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入

(4)、其他函数

修改操作除开上述方法外,还可以通过findAndModify()、findOneAndUpdate()、findOneAndReplace()方法来修改,如:

db.student.findAndModify({
  query:{_id:5},
  update:{$set:{"name": "李华"}},
  new: false
});

这些findAnd开头的修改方法,会根据条件修改满足条件的第一条数据,修改完之后,如果new指定为true,则会返回修改后的数据,如果为false,则返回修改前的数据(其余两个方法类似,不再继续演示)。

4、文档查询
(1)、数据初始化
db.student.remove({});
​
db.student.insert([
{"name":"小强"},
{"name":"小明","sex":"男","age":12},
{"name":"小红","sex":"女","age":11,"hobby":"买买买"},
{"name":"小刚","sex":"男","age":9},
{"_id":5,"name":"李华","sex":"男","age":7},
]);
(2)、基本查询
// 查询集合所有数据
db.student.find();
​
// 根据单个等值条件查询数据
db.student.find({"_id":5});
​
// 查询满足多个等值条件的数据(and查询)
db.student.find({"age":12, "sex":"男"});
​
// 查询满足任意一个条件的数据(or查询)
db.student.find({$or: [{"age":12}, {"sex":"女"}]});
​
// 查询单字段满足任意一个条件的数据(in查询)
db.student.find({"age":{$in: [7, 9]}});
​
// 查询性别为男,并且年龄小于10岁的数据
db.student.find({"sex":"男", "age":{$lt: 10}});
​
// 查询爱好为买买买,或id大于1的数据
db.student.find({$or: [{"hobby":"买买买"}, {_id: {$gt:1}}]});
​
// 查询id小于等于5,并且(age大于等于2 或 性别为男)的数据
db.student.find({
    _id:{$lte:5}, 
    $or: [{"age": {$gte:2}}, {"sex":"男"}]
});
​
// 查询name不为“李华” 或 age 不大于 10 的数据
db.student.find({$nor: [{"name":"李华"}, {"age":{$gt:10}}]});
​
// 查询年龄在9~12之间的数据(between and范围查询)
db.student.find({$and: [{"age":{$gte:9}}, {"age":{$lte:12}}]});
​
// 查询name以“小”开头的数据(like右模糊查询)
db.student.find({"name":/^小/});

上述一些查询语句,对应着SQL中的基本查询,如=、<、>、<=、>=、in、like、and、or,大家仔细观察会发现,其中有许多$开头的东东,这个是啥?在MongoDB中称之为操作符,操作符有许多,分别对应着SQL中的关键字与特殊字符,下面列写常用的:

SQLMongoDB
=:
=、<、>、<=、>=、!=$eq、$lt、$gt、$lte、$gte、$ne
in、not in$in、$nin
and、or、not、is null$and、$or、$not、$exists
+、-、*、/、%$add、$subtract、$multiply、$divide、$mod
group by、order by$group、$sort
…………

上表仅仅只列出了一些在SQL中比较常见的,实则MongoDB提供了几百个操作符,以此来满足各类场景下的需求,可以参考MongoDB中文网-运算符