一、通用语法
- 使用的是javascript语言来编写mongodb的命令语句
- 单行注释 // 单行注释的内容 ,多行注释 /* 多行的注释内容 */
- 代码是区分大小写的(大写和小写完全不同)
- 不同管navicat上面的颜色提示,有可能是不正确
- N/A —— 不可用(not applicable)
MongoDB中的重要元素
- 数据库
- 集合(collection) —— 类比于关系型数据库中的“表”
- 文档(document)—— 类比于表中的一行数据
- 整体用一对儿花括号括起来,里面可以有多项信息(多个字段),字段之间用逗号隔开,每个字段是一个键值对儿的组合
二、库、集合的操作
show dbs;
// 查看当前使用的数据库
db;
// 切换数据库:数据库可以事先不存在
// 只有当数据库中有了“集合”以后,这个数据库才真正的存在
// 将一个数据库中的所有集合都删除后,这个数据库也就不存在了
// 如果一个数据库不存在了,并不影响当前正在使用的数据库名
use companydb;
// 查看当前数据库下的所有集合
show collections;
// 在当前的数据库下创建集合,语法【db.createCollection("集合名")】
db.createCollection("employee");db.createCollection("department");db.createCollection("salary");
// 删除当前数据库下的指定集合,语法【db.集合名.drop()】
db.salary.drop();
db.employee.drop();
db.department.drop();
// 删除当前的数据库,语法:【db.dropDatabase()】
db.dropDatabase();
三、向集合中插入文档 —— insert
示例代码:
use schooldb;
show collections;
// 向集合中插入单个文档,语法:【db.集合名.insert(文档)】
// 向集合中插入一组文档,语法:【db.集合名.insert([文档, 文档2, 文档N])】
db.student.insert({"sno": "S1013", name: "测试员1", age: 23});
db.student.insert({"sno": "S1014", name: "测试员2", age: 22, sex: "女", country:
"元朝", tall: 1.73});db.student.insert([
{"sno": "S1029", name: "测试员3", age: 24, sex: "女", type: "测试",flowers: ["玫瑰花", "月季花", "郁金香"]},
{"sno": "S1066", name: "测试员4", age: 23, sex: "女", book: {title: "梦里花落
知多少", author: "测试员1", price: 38}},
{"sno": "S2031", name: "测试员5", age: 59, sex: "女", type: "测试"},{"sno": "S2063", name: "测试员6", age: 53, sex: "男", type: "测试"},{"sno": "S3064", name: "测试员7", age: 120, sex: "男", type: "测试"},
]);
// 可以自定义_id字段的值,必须确保不能重复。不推荐自定义_id,没必要
db.student.insert({_id: 12345678, sno: "S3011", name: "玄冥二老之玄", age:
78, sex: "男", type: "明教"});
db.student.insert({_id: 12345679, sno: "S3012", name: "玄冥二老之冥", age:
79, sex: "男", type: "明教"});// 重复的_id值,会报错
// db.student.insert({_id: 12345679, sno: "S1018", name: "测试8", age: 25,sex: "男", type: "测试"});
//
// 向集合中插入文档的时候,集合可以事先不存在。
// 如果集合事先不存在,则在插入了文档后,自动创建。//
db.course.insert([
{cno: 101, cname: "语文", teacher: "测试9"},{cno: 109, cname: "数学"},
{cno: 203, cname: "英语", count: 3}
]);
四、从集合中查询文档 —— find
db.集合名.find(); // 查询当前数据库指定集合中的所有文档
1.查询条件自身也是用“文档”来构造的
use schooldb;
/*
********************************************************************
条件查询的语法:【db.student.find(条件文档)】
********************************************************************
*/
// 查询性别等于女的学员信息
db.student.find({sex: "女"});
// 查询性别等于女、门派等于测试的学员信息
db.student.find({sex: "女", type: "测试"});
// 大小比较关系也用文档来表达
// $eq、$ne、$gt、$gte、$lt、$lte
// 等于、不等于、大于、大于或等于、小于、小于或等于
db.student.find({age: {$lt: 53} }) // 查询年龄小于53岁的学员
db.student.find({age: {$lte: 53}}) // 查询年龄小于或等于53岁的学员
db.student.find({age: {$eq: 53}}) // 查询年龄等于53岁的学员
db.student.find({age: 53}) // 查询年龄等于53岁的学员
db.student.find({age: {$ne: 53}}) // 查询年龄不等于53岁的学员db.student.find({age: {$gt: 53}}) // 查询年龄大于53岁的学员
db.student.find({age: {$gte: 53}}) // 查询年龄大于或等于53岁的学员
// 包含关系也用文档来表达
// $in、$nin
// 包含、不包含
// 查找门派属于测试1、测试2、测试3的学员信息
db.student.find({type: {$in: ['测试1', "测试2", "测试3"]}})
// 查找门派不属于测试1、测试2、测试3的学员信息
db.student.find({type: {$nin: ['测试1', "测试2", "测试3"]}})
// 逻辑运算的字段:$and(并且)$or(或者)$not(否)
// 一个条件的文档中,多个不同字段的键值对之间,默认就是“并且”关系
db.student.find({sex: "女", age: {$lte: 30}});// 如果出现多个重复字段名的键值对儿,最后一个覆盖前面的
db.student.find({sex: "女", sex: "男"}); // 覆盖了:查询的是性别为男的学生
db.student.find({age: {$gte: 30}, age: {$lte: 60}}); // 覆盖了:查询的是60岁及
以下的学员信息
// 如果对同一个字段,有多个并且关系的条件约束,可以在字段名后面的文档中,用多个条件键值
对儿
db.student.find({age: {$gte: 30, $lte: 60}});// $and字段的冒号后面,跟一个数组,数组中的多个条件文档,必须同时成立
db.student.find({$and: [{sex: "男"}, {age: {$gte: 60}}, {type: "明教"}]});db.student.find({sex: "男", age: {$gte: 60}, type: "明教"});
// $or字段的冒号后面,跟一个数组,数组中的多个条件文档,有1个成立,即满足条件
db.student.find({$or: [{sex: "女"}, {age: {$lte: 30}}]});// $not示例
db.student.find({age: {$gte: 53}})db.student.find({age: {$not: {$lt: 53}}})
db.student.find({sex: {$ne: "女"}})
db.student.find({sex: {$not: {$eq: "女"}}})
2.文档的字段是数组类型或者是文档类型的情况
use shoppingdb;
db.product.insert([
{item:"电影票",stocks:100,name:"测试1",price:50,director:"测试员1",actor:["测试人1","测试人2"]},
{item:"电影票",stocks:87,name:"测试2",price:50,director:"测试员2",actor:["测试人1","测试人2"]},
{item:"电影票",stocks:56,name:"测试3",price:60,director:"测试员3",actor:["测试人1","测试人2"]},
{item:"电影票",stocks:30,name:"测试4",price:40,director:"测试员4",actor:["测试人1","测试人2"]},
{item:"电影票",stocks:92,name:"测试5",price:20,director:"测试员5",actor:["测试人1","测试人2"]},
{item:"音乐",stocks:75,name:"测试6",artist:"测试",price:20,tracks:
["A","B","C"]},{item:"图书",stocks:50,name:"苏菲的世界",price:45,author:"乔斯坦贾德"},{item:"连衣裙",stocks:20,name:"mistry",price:280,size:{length:75,width:50,uom:"cm"}},{item:"电脑",stocks:10,name:"联想10",price:3700,size:{length:15,width:15,uom:"in"}}])
/*
********************************
某个字段的类型是数组
********************************
*/
// 数组类型字段的条件,如果是一个数组做条件,必须完全匹配:顺序、个数
// 查找出主演刚好是"测试人1","测试人2"的电影信息
db.product.find({actor: ["测试人2", "测试人1"]});db.product.find({actor: ["测试人1"]}); // 找不到
db.product.find({actor: ["测试人1", "测试人2"]}); // 找不到
// 数组类型字段的条件,如果是一个值做条件,只要包含这个值的文档,就匹配
// 查找出主演有“测试人1”的电影信息
db.product.find({actor: "测试人1"});
// 数组类型字段的条件,包含了其中一部分元素的,用:$all字段
// 查询出主演有“刘德华”、“测试人2”的电影信息(不考虑顺序、个数)db.product.find({actor: {$all: [测试人1","测试人2"]}});db.product.find({actor: {$all: ["测试人1","测试人2"]}});
// 根据数组字段中第N个元素(N从0开始计算),来做条件判断
// 语法:【"数组字段名.索引"】一定两边要加引号,索引从0开始
db.product.find({"actor.0": "测试人2"}); // 查询出第1主演是“测试人2”的电影信息db.product.find({"actor.1": "测试人2"}); // 查询出第2主演是“测试人2”的电影信息
// 根据数组字段中元素的个数(数组的长度)进行判断:用【$size】数组的长度
// 查询电影主演只有2位演员的电影信息
db.product.find({actor: {$size: 3}});
/*
********************************
某个字段的类型是文档
********************************
*/
// 完全匹配内嵌文档的每一个字段,并且顺序、数量也要一致
// 找到尺寸长为75cm、宽为50cm的商品信息
db.product.find({size: {length: 75, width: 50, uom: "cm"}})
// 根据内嵌文档的某1个字段来匹配,语法:【"字段名.子字段"】
// 引号一定要打上
db.product.find({"size.length": 75});
db.product.find({"size.length": 75, "size.uom": "cm"});
3.字段显示的控制
use shoppingdb;
/*
字段显示的控制
db.集合名.find({条件}, {字段显示控制});
字段名:1 —— 要显示这个字段字段名:0 —— 不显示这个字段
除了_id字段以外,其他的字段不能0、1混用*/
// 查询所有商品的名称、分类、库存和价格这4个字段(_id字段会自动显示出来)db.product.find({}, {item: 1, stocks: 1, name: 1, price: 1});
// 查询价格大于或等于50的商品的名称、分类、库存和价格这4个字段(_id字段会自动显示
出来)
db.product.find({price: {$gte: 50}}, {item: 1, stocks: 1, name: 1,price: 1});// 查询所有商品的名称、分类、库存和价格这4个字段(隐藏_id字段)
db.product.find({}, {item: 1, stocks: 1, name: 1, price: 1, _id: 0});// 查询所有商品的名称、分类、库存和价格这4个字段(隐藏_id字段,并且不显示主演信息)
// 报错:db.product.find({}, {item: 1, stocks: 1, name: 1, price: 1,
_
id: 0, actor: 0});
// 查询所有商品的除了库存和价格这2个字段以外的其他所有信息
db.product.find({}, {stocks: 0, price: 0});
4.查询结果的排序
use shoppingdb;
/*
排序的语法
db.集合名.find({条件}, {字段控制}).sort({排序字段})
字段名: 1 —— 升序
字段名:-1 —— 降序*/
db.product.find().sort({price: 1});db.product.find().sort({price: -1});db.product.find().sort({price: -1, stocks: 1}); // 先按照price降序,再按stocks升序
五、修改集合中的文档 —— update
use schooldb;
/*
db.集合名.update({条件}, {变更}); -- 只能最多修改1个文档db.集合名.updateMany({条件}, {变更}); -- 可能修改多个文档
*/
// $set —— 修改文档某个字段的值,或者增加指定的字段
db.student.update({}, {$set: {country: "中国"}}); // 修改满足条件的第1个文档db.student.updateMany({}, {$set: {country: "中国"}}); // 修改满足条件的所有文档
// $unset —— 修改文档:删除指定的字段,【{$unset: {字段名: 任意值}}】
db.student.updateMany({sex: "男"}, {$unset: {country: ""}});db.student.updateMany({sex: "女"}, {$unset: {country: 1}});
db.student.updateMany({name: "测试人1"}, {$unset: {country: "测试人2"}});
// $inc —— 在字段原有的值的基础上,增加(减少)一个量。注意:必须是数字类型的字段
// 如果文档没有这个字段,则按0开始计算
db.student.updateMany({}, {$inc: {age: 5}});db.student.updateMany({}, {$inc: {age: -4}});db.student.updateMany({}, {$inc: {tall: 0.03}});
// $push —— 为数组字段中,增加一个元素
db.student.update({name: "测试人3"}, {$push: {flowers: "测试人4"}});
六、删除集合中的文档 —— delete
use schooldb;
/*
db.集合名.deleteOne({条件}); —— 最多删除1个满足条件的文档
db.集合名.deleteMany({条件});
—— 删除多个满足条件的文档
只删除数据,保留集合
*/
db.student.deleteOne({name: "测试人1"})
db.student.deleteOne({sex: "女"})
db.student.deleteMany({sex: "女"})db.student.deleteMany({})