Mongo学习笔记
1、NoSQL(NoSQL = Not Only SQL),意即"不仅仅是SQL",指的是非关系型的数据库,用于超大规模数据的存储。
2、关系型数据库遵循ACID原则:A (Atomicity) 原子性(要么全部做完,要么都不做)、C (Consistency) 一致性(数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束,如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败)、I (Isolation) 独立性(并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响)、D (Durability) 持久性(一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失)
3、MongoDB是面向文档的NoSQL数据库,以JSON-like的二进制文档格式(BSON格式)存储数据。
每个文档可以有不同的结构和字段,文档内可嵌套数组、子文档等复杂结构,同一集合中的文档无需固定结构。
4、MongoDB的“动态模式”允许随时添加或删除字段,适合数据结构频繁变化的场景。
5、MongoDB使用类JavaScript 的查询语言(MQL),通过字段名直接访问文档属性,但缺乏JOIN操作,多文档关联需通过 $lookup 实现。
6、MongoDB 默认使用 B-Tree 索引,支持对文档任意字段建立索引,查询效率高。
7、MongoDB 是一种文档型数据库,由于它不限制数据量和数据类型,它是高容量环境下最合适的解决方案,适合内容管理系统、实时分析、物联网、社交媒体、缓存层(数据模型灵活,大规模数据处理)。
8、随着业务的复杂,我们会发现不同场景下对数据库的要求差异会很大:
一致性优先,选用关系型数据库。
高性能全文搜索,使用Elasticsearch。
非关键数据,读多写少,量大,选用列式存储,如ClickHouse
离线数据分析,Hive。
9、MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。

10、MongoDB 数据类型

ObjectId 类似唯一主键,MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象。
ObjectId 中保存了创建的时间戳,所以不需要为文档保存时间戳字段,可以通过 getTimestamp 函数来获取文档的创建时间
11、使用 mongosh 命令连接到 MongoDB 服务器(默认端口是27017):
mongosh --host
如:使用 testuser 用户进行身份验证连接
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"
标准 URI 连接语法:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
如:使用用户名和密码连接到本地 MongoDB 实例:
mongodb://username:password@localhost/mydatabase
12、当你使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它。
MongoDB 创建数据库的语法格式如下:use DATABASE_NAME,如:use runoob
如果你想查看所有数据库,可以使用命令:show dbs
如果你需要向 runoob 数据库插入一些数据: db.runoob.insertOne({"name":"菜鸟教程"})
13、通过 show collections 再次查看数据库中的集合:show collections
创建数据库后,通常需要在其中创建集合(collections),以存储文档(documents),集合类似于关系数据库中的表,使用 db.createCollection() 方法创建集合
use myNewDatabase
db.createCollection("myNewCollection")
使用 drop() 方法来删除集合及其所有文档,这是一个不可逆的操作:db.collectionName.drop()
如:删除集合 mycol2 :db.mycol2.drop()
14、要查看当前正在使用的数据库,可以使用 db 命令:db
如果你需要删除数据库,可以使用 db.dropDatabase() 方法,将删除当前正在使用的 myDatabase 数据库及其所有集合
use myDatabase
db.dropDatabase()
15、所有存储在集合中的数据都是 BSON 格式,BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称
nsertOne() 方法用于在集合中插入单个文档:db.collection.insertOne(document, options),示例:
db.myCollection.insertOne(
{name: "Alice", age: 25, city: "New York"}
);
insertMany() 方法用于在集合中插入多个文档:db.collection.insertMany(documents, options),示例:
db.myCollection.insertMany([
{ name: "Bob", age: 30, city: "Los Angeles" },
{ name: "Charlie", age: 35, city: "Chicago" }
]);
16、更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne()、updateMany()、replaceOne() 和 findOneAndUpdate()
17、MongoDB 查询文档使用 find()、findOne() 方法。find() 方法以非结构化的方式来显示所有文档
MongoDB 查询数据的语法格式如下:db.collection.find(query, projection)
query:用于查找文档的查询条件。默认为 {},即匹配所有文档。
projection(可选):指定返回结果中包含或排除的字段。
查找所有文档:db.myCollection.find();
按条件查找文档:db.myCollection.find({ age: { $gt: 25 } });
按条件查找文档,并只返回指定字段:
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.col.find().pretty()
18、findOne() 方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个
查找单个文档:db.myCollection.findOne({ name: "Alice" });
查找单个文档,并只返回指定字段:
db.myCollection.findOne(
{ name: "Alice" },
{ name: 1, age: 1, _id: 0 }
);
19、MongoDB 支持多种比较操作符,如 $gt等于、$lt小于、$gte大于等于、$lte小于等于、$eq等于、$ne不等于 、$in在指定的数组中、$nin不在指定的数组中
查找年龄大于 25 的文档:b.myCollection.find({ age: { $gt: 25 } });
查找年龄在 20、25 和 30 岁之间的人:db.collection.find({ age: { $in: [20, 25, 30] } })
20、MongoDB 支持多种逻辑操作符,如 $and、$or、$not、$nor 等
查找年龄大于 25 且城市为 "New York" 的文档:
db.myCollection.find({
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
});
20、可以使用正则表达式进行模式匹配查询
查找名字以 "A" 开头的文档:db.myCollection.find({ name: /^A/ });
21、可以对查询结果进行排序。
按年龄降序排序:db.myCollection.find().sort({ age: -1 });
按年龄字段升序排序:db.myCollection.find().sort({ age: 1 });
22、限制与跳过
可以对查询结果进行限制和跳过指定数量的文档。
返回前 10 个文档:db.myCollection.find().limit(10);
跳过前 5 个文档,返回接下来的 10 个文档:db.myCollection.find().skip(5).limit(10);
23、MongoDB 聚合
MongoDB中聚合的方法使用aggregate(),主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果
aggregate() 方法的基本语法格式如下所示:>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
24、MongoDB 监控
mongostat 命令:在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态

mongotop 命令:用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒

25、MongoDB 查询分析
可以确保我们所建立的索引是否有效,是查询语句性能分析的重要工具,MongoDB 查询分析常用函数有:explain() 和 hint()
在查询语句中使用 explain :>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
返回结果集的字段:
indexOnly: 字段为 true ,表示我们使用了索引
n:当前查询返回的文档数量。
nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好
millis:当前查询所需时间,毫秒数。
indexBounds:当前查询具体使用的索引。
可以使用 hint 来强制 MongoDB 使用一个指定的索引
如下查询实例指定了使用 gender 和 user_name 索引字段来查询:>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})


浙公网安备 33010602011771号