MongoDB是一种非关系型数据库,与传统的关系型数据库相比,其数据结构更加灵活、可扩展性更高,支持更多的数据类型和数据操作,同时也具有更好的性能和可伸缩性。了解MongoDB基础知识可以帮助我们更好地设计和优化数据模型,提高应用性能和可扩展性,也有助于理解后端开发中的一些概念和技术。
NoSQL是指非关系型数据库,与传统的关系型数据库相对应。在NoSQL数据库中,数据是以键值对、文档、列族或图形等方式进行存储,而非传统的二维表格的形式。
相比于传统的关系型数据库,NoSQL数据库具有更好的可扩展性、更好的性能和更高的灵活性。常见的NoSQL数据库有MongoDB、Cassandra、Redis、Couchbase等。我在百度上找了个图,形象地展现两个数据库的差异(如有侵权,请联系我删除)
可以将传统数据库比喻为图书馆,每本书都有明确的编号、分类、位置等信息,检索和管理起来比较繁琐。而 NoSQL 数据库则可以比喻成一个散乱的书房,书籍没有明确的编号和分类,但可以根据需要进行快速检索和管理,使用起来更加灵活和便捷。
也就是说,传统数据库像是一份结构化的问卷,填写和查询都需要按照规定的格式,而 NoSQL 数据库则像是自由格式的笔记本,更适合处理非结构化和大规模数据。
MongoDB是一个面向文档的数据库,以JSON格式存储数据,具有丰富的查询语言和高性能的读写能力,同时也支持数据的自动分片和多副本部署等功能,可以轻松应对大规模数据的处理。具有以下几大特点
MongoDB是一种非关系型数据库,也被称为NoSQL数据库,与传统的关系型数据库不同,MongoDB的文档可以有不同的结构,可以嵌套和扩展字段,使得数据建模更加灵活和自由。
MongoDB的数据是以文档的形式存储,每个文档是一个键值对的集合,类似于JSON格式,可以嵌套子文档,支持数组类型的字段。MongoDB支持多种数据类型,包括文本、数值、日期、数组、对象等。
MongoDB支持分布式存储,可以通过横向扩展来实现高可用性和可扩展性,通过数据分片的方式,将数据分散存储在多个节点上,从而提高数据的可用性和性能。
MongoDB具有高性能的特点,可以支持快速的读写操作,同时支持复杂的查询语句和索引,提供了多种查询方式和排序方式。
MongoDB的架构设计可以很好地支持横向扩展,可以通过增加节点来扩展数据存储和处理能力,从而适应不断增长的数据规模和访问量。
MongoDB提供了安全认证机制和数据加密等安全措施,可以保障数据的安全性和完整性。
我的技术栈是js,下面用win电脑和node.js举个例子
在MongoDB官网下载对应操作系统的安装包,按默认配置傻瓜式安装即可。
https://www.mongodb.com/docs/manual/
在操作系统的环境变量中添加MongoDB的安装路径
C:\Program Files\MongoDB\Server\5.0\bin。
创建data的目录,在该目录下创建两个空文件夹db和logs,用于存储数据库文件和日志文件。
D:\MongoDB\data\db
D:\MongoDB\data\logs
在终端或命令行窗口中输入命令mongod
mongod
启动MongoDB服务,如果启动失败,需要检查是否有其他程序占用了MongoDB默认的端口号(27017),可以在启动命令中指定端口号
mongod --port 。
如果连接失败,需要检查连接参数是否正确,例如是否指定了正确的IP地址和端口号
mongo --host --port
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb://localhost:27017/mydb";
MongoClient.connect(uri, function(err, db) {
if (err) throw err;
const dbo = db.db("mydb");
dbo.collection("customers").findOne({}, function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
连接MongoDB成功后,我们就可以开始进行基本操作了,也就是增删改查。下面是一些常用的命令行操作:
向当前集合中插入一条文档,document为一个JSON对象,表示需要插入的数据
db.collection.insert(document)
使用insertOne就是插入一条数据,如果需要插入多条文档就用insertMany方法
db.collection('users').insertOne({name: 'John', age: 30});
db.collection('users').insertMany([{name: 'Jane', age: 25}, {name: 'Jack', age: 35}]);
使用find方法来查询数据,可以通过指定条件来筛选出符合条件的数据
db.collection.find(query, projection):
查询当前集合中的文档,query为查询条件,projection为可选参数,表示需要返回的字段。查询条件和返回字段都可以使用MongoDB的查询操作符进行设置。
db.collection('users').find({age: {$gt: 25}});
其中, g t 表示大于, gt表示大于, gt表示大于,lt表示小于,$eq表示等于等等。
db.collection.update(query, update, options)
更新当前集合中符合条件的文档,query为查询条件,update为需要更新的字段,options为可选参数,用于设置更新操作的一些属性。也可以使用updateOne或updateMany方法来更新数据
db.collection('users').updateOne({name: 'John'}, {$set: {age: 40}});
db.collection('users').updateMany({age: {$lt: 30}}, {$set: {age: 30}});
db.collection.delete(query)
删除当前集合中符合条件的文档,query为查询条件,同样地,也可以使用deleteOne或deleteMany方法来删除数据
db.collection('users').deleteOne({name: 'John'});
db.collection('users').deleteMany({age: {$lt: 30}});
// 删除当前所在的数据库
db.dropDatabase()
// 创建一个集合(类似于传统数据库中的表),name为集合名称,options为可选参数,用于设置集合的一些属性
db.createCollection(name, options)
// 删除当前集合
db.collection.drop()
// 使用聚合管道对当前集合进行聚合操作。聚合管道是一系列的聚合阶段,每个阶段都对输入文档进行转换,然后将转换结果传递给下一个阶段。
db.collection.aggregate(pipeline)
// 为当前集合中的文档创建索引,keys为需要创建索引的字段,options为可选参数,用于设置索引的一些属性。索引可以提高查询性能。
db.collection.ensureIndex(keys, options)
这些命令行操作只是MongoDB的冰山一角,还有很多高级用法和命令可以深入学习。