MongoDB 入门

NoSQL 数据库类型分为 列存储、文档存储、键值存储、图存储、对象存储、xml 数据库 6种类型。(来自w3cschool教程)
MongoDB 是由C++语言编写的开源数据库系统。其将数据存储为一个文档,是一个基于分布式文件存储的数据库。
MongoDB 区分大小写

安装

MongoDB 安装:3.2版本之后不支持32位windows操作系统,小版本为偶数的版本为稳定版。如3.4, 4.0。MongoDB 的安装步骤很简单,如果不修改安装目录,一直下一步即可。安装步骤略。。。
我这里安装的是当前最新稳定版4.0.9,安装完成后自带了 MongoDB Compass Community,打开 MongoDB Compass Community,可以直接在这个工具上进行文档(数据)的增删改查,感觉类似于 oracle 的 plsql 。
在这里插入图片描述在这里插入图片描述以上就是我知道的一些基本操作,我没有找到编写脚本文件的窗口,所以我后面将使用如下 NoSQL Manager for MongoDB 工具,通过编写脚本可以更清楚地学习 MongoDB 的语法。
在这里插入图片描述
MongoDB 中可以存放多个数据库,一个数据库可以存放多个集合,一个集合可以存放多个文档,文档是 MongoDB 中的最小操作单元
集合类似 sql 数据库(oracle)中的表,文档类似一条记录,或者说一行
数据库和集合不用我们特意创建,插入数据时将自动创建
在这里插入图片描述

基本指令

/**
基本指令
*/
show dbs;  //显示有哪些数据库
use local;  //使用指定的数据库
db;  //显示当前使用的数据库
show collections;  //显示当前数据库的所有集合

CURD

—添加—
db.<集合名>.insert() 参数可以是一个文档对象,也可以是一个文档对象数组
文档对象其实就是一个 json 对象
添加的每一个文档对象都会有一个 _id 属性,值也会默认生成。如果自己指定,则用自己指定的值。
例:执行 db.students.insert() 时,students 集合如果不存在会自动创建。

在 MongoDB3.2版本之后加入的 insertOne(),insertMany() 方法,功能同方法名。insertOne() 只能传入单个文档对象,insertMany()只能传入对象数组。

//插入一条数据时,传入一个文档对象
db.students.insert({sname:"张三",sage:21});
db.students.insertOne({_id:"1234567",sname:"tom",sgender:"male"});
//插入多条数据时,传入一个对象数组
db.students.insert([
    {sname:"李四",sage:25},
    {sname:"王五",sage:30}
]);
db.students.insertMany([
    {sname:"lily",sage:16,sgender:"female"},
    {sname:"rose",sage:18,sgender:"female"}
]);
db.students.find();

执行结果如下:

在这里插入图片描述属性值可以是文档对象,称内嵌文档。示例如下:
在这里插入图片描述
—查询—
db.<集合名>.find() 不传参或传空对象都表示查找该集合中全部文档对象,返回的是一个对象数组,可以下标取值。如:db.<>.find()[0]
进行条件查询时,需要传入文档对象。
pretty() 可以格式化查询结果,是结果展示更美观,只支持展示结果为 json 格式的
db.<>.findOne() 只查询符合条件的第一个对象,可以直接取属性值。如:db.<>.find().sname

查询内嵌文档的属性时,支持用点号(.)进行查询

db.<>.find().count()db.<>.length() 查询所有结果的个数

只想查询部分指定属性,需传入第二个参数,要显示的给1,不显示的给0,不指定的默认不显示,_id 默认都显示,可用0不显示

//查询全部
db.students.find().pretty();
db.students.find({});
//查询指定属性,结果只显示想要的属性
//第一个参数表示不指定查询的限制条件,第二个参数表示只查询sname sgender属性
db.students.find({},{sname:1,_id:0,sgender:1});
//根据条件查询
//与查询
db.students.find({sname:"lily",sgender:"female"}).pretty();
//或查询
db.students.find({$or:[{sname:"lily"},{sgender:"male"}]});
//查询sgender为female 且(sname为lily 或sname为rose)的对象
db.students.find({sgender:"female",$or:[{sname:"lily"},{sname:"rose"}]});
//非查询
db.students.find({sgender:{$ne:"female"}}); //查询sgender!="female"的对象
db.students.find({sgender:{$nin:["male","female"]}});  //not in
//模糊查询
db.students.find({sgender:{$regex:/male/}}); //sgender like "%male%"
//分页查询
db.students.find().limit(3); //取前3条数据
db.students.find().limit(2).skip(2); //跳过前2条,取2条,即取第3-4条数据
//查询内嵌属性
db.students.find({"saddr.city":"赣州市"}); //这里的键必须有引号,否则报错
//排序
db.students.find().sort({sgender:-1,sage:1}); //按sgender降序、sage升序排序
//统计
db.students.find().count();
db.students.find().length();

—修改—
db.<>.update(doc, doc) 要传两个对象,默认替换为新对象。
$set 用来修改指定属性,第二个对象传入 $set 对象,里面写被修改的目标属性。默认只修改第一个匹配对象,可添加第三个参数对象,修改多个
$unset 删除指定属性
在数组中增加新元素: $push,元素可重复; $addToSet 不可重复

db.<>.updateOne() 只修改第一个匹配的对象
db.<>.updateMany() 修改匹配的所有对象
db.<>.replaceOne() 替换,跟没写 $set 的 update 方法一样

// 如果不用 $set ,将把旧对象直接替换为新对象,而不是修改
db.students.update({sname:"王五"},{sgender:'male'});//王五这条记录只剩_id和sgender ,其他属性都没了
//修改张三的 saddr sage ,默认只修改第一个匹配对象
db.students.update({sname:"张三"},{$set:{saddr:"北京丰台",sage:18}});
// 修改匹配的多个对象
db.students.update({sgender:"female"},{$set:{sage:24}},{multi:true});
// 在原属性值基础上加上某个数,张三的sage在原基础上加5
db.students.update({sname:'张三'},{$inc:{sage:5}});
//去除某个指定属性
//因为要删掉 saddr 这个属性,所以值写什么都可以,但是不能不写
db.students.update({sname:'张三'},{$unset:{saddr:1}});

//加入一个数组
db.students.insert(
    {sname:'test',hobbies:['篮球','足球','兵乓球']}
);
//更新时添加一个数组元素:$push 可添加重复元素,$addToSet 添加不重复的元素,如果有相同的,则不添加
db.students.update({sname:'test'},{$push:{hobbies:'网球'}});
db.students.update({sname:'test'},{$addToSet:{hobbies:'网球'}});

//db.students.findOne({sname:'test'}).hobbies[3];
//修改数组指定元素,本例修改hobbies数组下标为0的元素
db.students.update({sname:'test'},{$set:{'hobbies.0':'排球'}});

db.students.find();

—删除—
db.<>.remove()
必须传参,否则报错;如果参数是空对象,则删除全部文档对象。删除匹配的第一个对象需要传入第二个参数
db.<>.deleteOne()
db.<>.deleteMany()

db.<>.drop() 删除当前集合
如果所有集合没了,数据库也没了
db.dropDatabase() 删除数据库

db.books.insert([
    {title:"语文",pages:100},
    {title:"数学",pages:200},
    {title:"英语",pages:300},
    {title:"政治",pages:300}
]);
db.books.find();

//删除全部
db.books.remove({});
//删除匹配的全部对象
db.books.remove({pages:300});
db.books.deleteMany({pages:300});
//删除匹配到的第一个对象
db.books.remove({pages:300},true);
db.books.deleteOne({pages:300});

//删除集合
db.books.drop();
//创建一个数据库实例,并切换至该数据库
use tempdb;
db.test.insert({name:"test"}); //插入一条数据才会显示该数据库
//删除当前数据库实例
db.dropDatabase();

操作符

$eq等于
$ne不等于
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$inin 在某个范围里面
$ninnot in 不在某个范围里面
$and
$or
$not非 ,值是一个对象
$nor都不,值是一个对象数组
$exists是否存在指定属性
$type具有指定类型的属性
$regex正则匹配
db.books.insert([
    {title:"语文",pages:100},
    {title:"数学",pages:"200"},
    {title:"英语",pages:300,price:99.9},
    {title:"政治",pages:300}
]);
//查询pages既不是100也不是200的对象,200与"200"不同哦
db.books.find({$nor:[{pages:100},{pages:200}]});
//查询有price属性的对象
db.books.find({price:{$exists:true}});
//查询title的数据类型是string 的对象
db.books.find({pages:{$type:2}});
db.books.find({pages:{$type:"string"}});
...

更多操作符用法 >> https://docs.mongodb.com/manual/reference/operator/query/

文档间的关系

文档间的关系有一对一、一对多(多对一),多对多

//张三的课程
db.courses.insert([
    {cname:"语文",c_students_id:ObjectId("5ce68d23d279ceb7b98f6b03")},
    {cname:"数学",c_students_id:ObjectId("5ce68d23d279ceb7b98f6b03")}
]);
db.courses.find();

//嵌套查询张三的课程
var sid = db.students.findOne({sname:"张三"})._id;
db.courses.find({c_students_id:sid});

一对一:students 集合每个学生一条记录,courses 集合每个课程存一个学生的 id
一对多:students 集合每个学生一条记录,courses 集合多个课程存一个学生的 id,如上示例
多对多:students 集合有多个学生存了同一个课程的 id,courses 集合有多个课程存了同一个学生的 id。
这样的关系想必大家都清楚,这里就不赘述了

本文只是记录了 MongoDB 的一些简单用法,更多灵活、高级的功能请参考官方文档https://docs.mongodb.com/manual/tutorial/getting-started/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值