文章目录
1. 基本概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | db | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
启动monggodb的服务架构:
2. 文档的基本数据结构
-
文档的基本结构:{ < key > : < value>, < key> : {< value>}, … }
-
封闭符 {}
-
分隔符 ,
-
连接符 :
-
-
键的数据类型:UTF-8字符,可以用”“引起来,如”name“
-
< key>的用户命名规则:
(1)‘_id’ 为保留字段key
(2) 禁止使用’$'符号
(3) 禁止使用’.'符号
(4) 避免同一个{}中使用重复的
-
值< value>的数据类型:MongoDB支持的任意数据类型
-
基本数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。“” |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。true/false = 1/0 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。[] |
Timestamp | 时间戳。记录文档修改或添加的具体时间。Timestamp() |
Object | 用于内嵌文档。{} |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
3. 数据库(db)命令
// 查看当前服务器上的数据库
show dbs;
show databases;
// 选择名为mydb的数据库(如果没有则创建)
use mydb;
// 查看当前使用的数据库
db;
// 查看当前数据库的统计信息
db.stats();
// 查看当前数据库的操作信息
db.currentOp();
// 删除当前数据库
db.dropDatabase();
navicat实战:
// 创建数据库
// use 使用数据库,如果这个数据库不存在就创建
use cq
// 函数式写法
// db = db.getSiblingDB("cq")
// 2. 查看数据库名
show databases;
// show dbs; 缩写
注:刚刚创建的数据库看不到,因为只是创建了一个名字,在创建集合之前没有文件生成
4. 集合(collection)与添加(insert()/one/many)
4.1集合
// 查看当前数据库中的集合
show collections;
show tables;
// 创建一个名为mycoll的集合
db.createCollection("mycoll");
// 重命名mycoll集合,新集合名叫mycollection
db.mycoll.renameCollection("mycollectioin")
// 清空一个mycollection的集合
db.mycollection.remove({});
// 删除一个mycollection的集合
db.mycollection.drop();
4.2添加
insert() 方法
注意:db.collection中,collection为你要操作的集合的名称
db.collection.insert(
<document or array of documents>,
{multi: false}
)
insertOne() 方法
添加一条文档记录
db.collection.insertOne(
<document>{}
)
insertMany() 方法
添加多条文档记录 ([]方括号表示数组)
db.collection.insertMany(
[ <document 1> {} , <document 2> {}, ... ] --jsonArray
)
navicat实战:
insert:
// 集合(collection)可以显式的创建
db.createCollection("collectionname")
// 数据库操作命令结构: db.集合名.集合操作(参数...)
// 在集合中插入文档
// 构造文档JSON
// db.集合名.insert(文档对象)
// db.集合名.insert(文档列表对象)
var doc = {
"姓名":"小趴菜", 性别:"男", 学号:"20200011", 成绩:88.8 };
// 将doc作为参数传给db.collectionname.insert函数
db.collectionname.insert(doc)
添加一条文档记录{“lastname”:“Tan”, “firstname”:“Guangyu”}到集合mycollection:insertone
db.mycollection.insert({
"lastname":"xiao", "firstname":"pacai"});
db.mycollection.insertOne({
"lastname":"xiao", "firstname":"pacai"});
添加一个文档数组mydocs(多条文档的数组)到集合mycollection,使用insert或insertMany方法
// 多条文档记录用[]组合到一个数组mydocs中。
// 注意 coursename处于两个花括号中,属于两个内嵌的文档,不算重复的键
var mydocs = [
{
"lastname" : "xiao",
"firstname" : "pacai",
"role" : "teacher",
"teacher_id" : "20201111",
"title" : "讲师",
"courses" : [
{ "coursename" : "nosql" },
{ "coursename" : "mysql" },
{ "coursename" : "python" },
{ "coursename" : "linux" },
{ "coursename" : "kettle" }
]
},
{
"lastname" : "xiao",
"firstname" : "1",
"role" : "student",
"student_id" : "2020000001",
"grade" : "2020",
"class" : "1",
"score" : 80
},
{
"lastname" : "xiao",
"firstname" : "2",
"role" : "student",
"student_id" : "2020000002",
"grade" : "2020",
"class" : "2",
"score" : 70
}
];
//db.mycollection.insert(mydocs);
// 3.2版后新的方法:insertMany
db.mycollection.insertMany(mydocs);
5. 查询(find)及操作符
5.1查询(find)
Mongo: db.集合名.find(查询条件,返回字段)
db.<collection>.find(<querydocument>, <projection>)
db.<collection>.findOne(<querydocument>, <projection>)
// 成绩大于70,id=1
db.mycollection.find({
"score":{$gt:70}},{student_id:1});
查询集合mycollection中的文档
db.mycollection.find();
// 将查询结果"漂亮化"
db.mycollection.find().pretty();
// 查询集合mycollection中键为role, 值为student的文档记录
db.mycollection.find( {
"role" : "student"} );
// 将查询条件写入文档对象ceriteria查询
var criteria = { "role" : "student" };
db.mycollection.find(criteria);
// 使用内嵌对象的字段值查询
db.mycollection.find({
"courses.coursename":"mysql"})
5.2对数值的条件查询:查询操作符
操作 | 操作符 | 范例 | SQL的类似语句 |
---|---|---|---|
等于 | : | db.mycollection.find({“role”:“student”}) | where role= ‘student’ |
小于 less than | $lt: | db.mycollection.find({“score”:{$lt:80}}) | where score < 80 |
小于或等于less than / equal | $lte: | db.mycollection.find({“score”:{$lte:80}}) | where score <= 80 |
大于greater than | $gt: | db.mycollection.find({“score”:{$gt:80}}) | where score > 80 |
大于或等于greater than / equal | $gte: | db.mycollection.find({“score”:{$gte:80}}) | where score >= 80 |
不等于 not equal | $ne: | db.mycollection.find({“score”:{$ne:80}}) | where score != 80 |
// Mongo: db.集合名.find(查询条件,返回字段)
// select * from table
var 查询条件 = {};
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
db.mycollection.find(); // 参数文档为空可以不写
例子:
// select * from mydb where score>70
var 查询条件 = {
"score":{$gt:70}}; // >70 ---- {$gt:70}
var 查询条件 = {
"score":{$lt:70}}; // <70 ---- {$lt:70}
var 查询条件 = {
"score":{$gte:70}}; // >=70 ---- {$gte:70}
var 查询条件 = {
"score":{$lte:70}}; // <=70 ---- {$lte:70}
var 查询条件 = {
"score":{$ne:70}}; // !=70 ---- {$ne:70}
var 查询条件 = {
"score":{$in:[70,80]}}; // in (70,80) ---- {$in:[70,80]}
var 查询条件 = {
"score":{$nin:[70,80]}}; // not in (70,80) ---- {$nin:[70,80]}
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
多个 条件 之间可以使用逻辑操作符and、or/in、not、exists
// AND
var 查询条件 = {
"grade":"2020","class":"1"};
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
// OR
// 使用$or操作符
var 查询条件1 = {
"class":"1"};
var 查询条件2 = {
"class":"2"};
var 查询条件 = {$or:[查询条件1,查询条件2]};
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
// 也可以使用$in操作符
var 查询条件 = {
"class":{$in:["1","2"]}};
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
// NOT $not
var 查询条件 = {
"score":{$not:{$gt:70}}}; // !>70 ---- {$not:{$gt:70}}
var 返回字段 = {};
db.mycollection.find(查询条件,返回字段);
注意: $lte 不等价于 $not:{$gt},$not是逻辑运算,不是比较运算,是对条件结果取反集
// **查询不存在学生学号(studnet_id)字段**
var 查询条件 = {
"student_id":{$exists:0}}
db.mycollection.find(查询条件)
5.3 elemMatch在数组(列表)中元素内匹配
案例:
首先利用sql语句随机生成一个学生信息表如下格式:
每一个数据格式类似如上
注意:以上信息是随机生成,如有雷同,纯属巧合
要求:
利用elemmatch匹配找出数据导入与预处理应用不及格的学生信息:
//查询数据导入与预处理应用不及格的学生信息
var 查询条件 = {
"courses":{$elemMatch:{
"course":"数据导入与预处理应用","score":{$lt:60}}}};
var 返回字段 = {_id:0,sno:1,name:1,grade:1,class:1};
var 返回字段 = {};
db.students.find(查询条件,返回字段)
只要数据导入与预处理不及格的科目:
//查询数据导入与预处理和数据只要 数据导入
var 查询条件 = {
"courses":{$elemMatch:{
"course":"数据导入与预处理应用","score":{$lt:60}}}};
var 返回字段 = {_id:0,sno:1,name:1,grade:1,major:1,"courses":{$elemMatch:{
"course":"数据导入与预处理应用","score":{$lt:60}}}};
db.students.find(查询条件,返回字段)
5.4 count统计数据
语法:
db.collection.count(查询条件)
案例:
统计所有女生人数:
db.students.count() //查询所有
var 查询条件 = {gender:0};//女生
db.students.count(查询条件);
//第二种写法
db.students.find(查询条件).count()
5.5 distinct获取不重复的取值
语句用法:
db.students.distinct(取值字段,查询条件)
案例:
查询2018级有哪些专业;2019级学生上的课程:
var 查询条件 = {grade:2018};
var 返回条件 = {grade:1,major:1,_id:0}
db.students.distinct("major",查询条件)
//2019级学生上的课程
db.students.distinct("courses.course",{grade:2019})
5.6 aggregate聚合管道查询
语法:
var 步骤1 = {步骤操作符:操作内容}
var 步骤列表 = [步骤1,步骤2]
db.students.aggregate(步骤列表)
案例:
统计男女生人数:
var 步骤1 = {$group:{_id:"$gender",人数:{$sum:1}}}
var 步骤2 = {$project:{性别:"$_id",人数:1,_id:0}}
var 步骤列表 = [步骤1,步骤2]
db.students.aggregate(步骤列表)