NoSQL介绍及MongoDB的安装及使用_踩踩踩从踩的博客-CSDN博客
前言
本篇文章会开始从客户端使用和选型 包括java客户端 maven 中 CRUD操作。以及批量 写作 spring对Mongodb的支持;以及高级用法 包括聚合管道、MapReduce 、单一作用聚合、以及聚合管道和MapReduce对比;在mongodb中使用 存储过程。这些高级语法了解并分析mongodb,这都是在不同版本上不断的优化更新的。
图形化客户端
- MongoDB自带的图形化客户端:Compass Community
- 第三方mongoDB的图形化客户端:robomongo
安装过后直接运行就行。
这些聚合函数等。可以直接使用命名进行展示。
MongoDB客户端驱动
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[datab
ase][?options]]
MongoDB CRUD操作
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>${mongodb.driver.sync}</version>
</dependency>
这个在官网上 都有配置的驱动,可以使用。
以及包括的示例
可以通过 mongoclients进行连接 mongodb ,在方法中也包含了什么close方法等。
这里需要获取集合等。
并且可以看出 hosts 方法所以可以做一个连接 host的集合,多台服务器。
并且在文档中 有bson 结构 上,有什么 document 可以扩展出来的。
这些在源码客户端中能看到。
这里采用 linkedHashMap 都是需要有序的字段。添加用户做事情。
并且在客户端中 集合中提供的添加数据,都可以使用 insertMany方法等都可以使用的。
这里面也包含了 一些 delete update等方法
原来采用命令的方式 $set 符号,这里 可以使用 addEachToSet方法进行批量写入
这在源码中 update方法中有很多好的方法
还有包括updateOne pusheach 会帮我们进行拼装
这都可以使用方法的方式进行操作,而减少写什么$set $all 等方式。
相对于来说api 比较丰富 ,合适的。
以及在客户端中 可以采用 正则表达式的方式 都可以使用的。
包括编码解码器提供者。
这都是在客户端中会存在的。
通过反射的方式具体进行使用。
在spring中的使用
都会针对使用。
包括连接池的使用方式等。
在spring中使用 就非常方便和丰富的。
批量写操作
Spring对MongoDB的支持
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
聚合查询
- 聚合管道
- MapReduce
- 单一作用聚合
单一作用聚合
也算是比较常用的,用在单一集合上面,功能虽然不强大,但是也是比较有用的。
包括上面估准的 count值
这里都是评论的 分组 这些就是单一聚合形式
聚合管道
// 聚合管道操作语法
db.collection.aggregate(<pipelines>, <options>)
- pipelines
- options
// $math,筛选条件
/* SELECT item,
Sum(( price * quantity )) AS totalSaleAmount
FROM sales
GROUP BY item
HAVING totalSaleAmount >= 100
*/
db.sales.aggregate(
[
// First Stage
{
$group :
{
_id : "$item",
totalSaleAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } }
}
},
// Second Stage
{
$match: { "totalSaleAmount": { $gte: 100 } }
}
]
)
分组统计,变量的方式。
lookup,多表关联
SELECT *, inventory_docs
FROM orders
WHERE inventory_docs IN (
SELECT * FROM inventory WHERE sku= orders.item
db.orders.aggregate([
{
$lookup:
{
from: "inventory",
localField: "item",
foreignField: "sku",
as: "inventory_docs"
}
}
])
可以采用这种方式进行操作
将聚合结果汇入新表
db.inventory.aggregate( [
// First Stage
{
$unwind: { path: "$tags", preserveNullAndEmptyArrays: true }
},
// Second Stage
{
$group:
{
_id: "$tags",
averageQty: { $avg: "$qty" }
}
},
// Third Stage
{
$sort: { "averageQty": -1 }
},
{ $out : "tagsAvgQty" }
] )
Aggregation Pipeline Stages — MongoDB Manual
这在官方文章中有大量的对应操作。
MapReduce
- map,将数据拆分成键值对,交给reduce函数
- reduce,根据键将值做统计运算
- out,可选,将结果汇入指定表
- quey,可选筛选数据的条件,筛选的数据送入map
- sort,排序完后,送入map
- limit,限制送入map的文档数
- finalize,可选,修改reduce的结果后进行输出
- scope,可选,指定map、reduce、finalize的全局变量
- jsMode,可选,默认false。在mapreduce过程中是否将数 据转换成bson格式。
- verbose,可选,是否在结果中显示时间,默认false
- bypassDocmentValidation,可选,是否略过数据校验
首先把集合数据拿出来,进行 map 分组,然后数组相加,key进行累加取平均值,然后 输出出来。
本来mapreduce 得益于多线程,而解决问题,数组内容,进行遍历。 任务处理这一块
聚合管道和MapReduce对比
全文检索
存储过程
- 创建一个存储过程
- 加载存储过程
- 查看存储过程
- 执行存储过程
/*准备数据*/
use test
db.inventory.drop()
db.inventory.insertMany([
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, tags: ["blank", "red", "small"], size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, tags: ["gray", "yellow", "green"], size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, tags: ["gray", "yellow", "green"], size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, tags: ["gray", "yellow", "green"], size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, tags: ["gray", "yellow", "green"], size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, tags: ["gray", "yellow", "green"], size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, tags: ["gel", "blue", "big"], size: { h: 19, w: 22.85, uom: "cm" }, status: "A" },
{ item: "mobile", qty: 250, tags: ["red", "big"], status: "A" },
{ item: "map", qty: 250, length: [129, 500, 1000], status: "A" },
{ item: "apple", qty: 250, length: [29, 50, 90], status: "A" },
{ item: "banana", qty: 150, status: "A" },
{ item: "orange", qty: 90, size: { h: 19, w: 22.85, uom: "cm" }, status: "A" }
]);
// 创建一个存储过程
db.system.js.insert({
_id:"updateQty",
value:function(itemParm, qtyParm) {
return db.inventory.update(
{item:itemParm},
{$set:{qty: qtyParm}}
);
}
});
// 加载存储过程
db.loadServerScripts();
// 查看存储过程
db.system.js.find().pretty();
// 执行存储过程
updateQty("journal", 200);