Mongo高级用法

NoSQL介绍及MongoDB的安装及使用_踩踩踩从踩的博客-CSDN博客

前言

本篇文章会开始从客户端使用和选型   包括java客户端 maven 中 CRUD操作。以及批量 写作 spring对Mongodb的支持;以及高级用法  包括聚合管道、MapReduce  、单一作用聚合、以及聚合管道和MapReduce对比;在mongodb中使用 存储过程。这些高级语法了解并分析mongodb,这都是在不同版本上不断的优化更新的。

图形化客户端

除了Shell还有两种图形化客户
  • MongoDB自带的图形化客户端:Compass Community
  • 第三方mongoDB的图形化客户端:robomongo

 安装过后直接运行就行。

这些聚合函数等。可以直接使用命名进行展示。

MongoDB客户端驱动

客户端驱动标准URI连接语法
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[datab
ase][?options]]
MongoDB支持的客户端语言驱动
C/C++、C#、GO、 Java 、NodeJs、Perl等主流编程语言
Java语言可以通过下面两种方式开发
 1. MongoDB原生客户端
2. spring-data-mongodb

MongoDB CRUD操作

原生客户端基础操作
        
    连接到MongoDB;选择数据库、集合;创建索引;增删改查。
    代码示例:Bson文档、Java Pojo操作
POM文件
<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中使用 就非常方便和丰富的。

批量写操作

MongoDB服务器以允许驱动程序为BulkWriteResult和BulkWriteException实现正确语义的方式,支持用于插入, 更新和删除的批量写入命令
批量操作有两种类型,有序和无序批量操作。
1. 有序批量操作按顺序执行所有操作,并在第一个写入错误时出错。
2. 无序批量操作将执行所有操作并报告所有错误。无序批量操作不能保证执行顺序

Spring对MongoDB的支持

1. pom引入spring-data-mongodb依赖
2. 配置mongodb信息
3. 类中引用MongoOperations接口
4. 使用MongoOperations完成
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

Spring Data MongoDB - Reference Documentation

聚合查询

聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返 回单个结果。聚合操作包含三类:聚合管道、MapReduce、单一作用聚合
  • 聚合管道
聚合管道是一个数据聚合的框架,模型基于数据处理流水线的概念。文档进入多级管道,将
文档转换为聚合结果。
将流程作为管道,每个部分做个聚合数据处理
  • MapReduce
MapReduce操作具有两个阶段:处理每个文档并向每个输入文档发射一个或多个对象的map阶 段,以及reduce组合map操作的输出的阶段。
  • 单一作用聚合
提供了对常见聚合过程的简单访问,操作都从单个集合聚合文档。

单一作用聚合

MongoDB提供
db.collection.estimatedDocumentCount(),
db.collection.count(),
db.collection.distinct()
这类单一作用的聚合函数。
它们缺乏聚合管道和map-Reduce的灵活性和功能。

 也算是比较常用的,用在单一集合上面,功能虽然不强大,但是也是比较有用的。

包括上面估准的 count值

 

 这里都是评论的 分组  这些就是单一聚合形式

聚合管道

聚合管道包含多个阶段,每个阶段在文件通过管道时进行转换。
// 聚合管道操作语法
db.collection.aggregate(<pipelines>, <options>)
  • pipelines
    一组数据聚合阶段。除$out、$Merge和$geonear阶段之外,每个阶
段都可以在管道中出现多次。
  • 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

MapReduce操作将大量的数据处理工作拆分成多个线程并行处理,让后将结果合并在一起。
MapReduce具有两个阶段:
1. 将具有相同Key的文档数据整合在一起的map阶段
2. 组合map操作的结果进行统计输出的reduce阶段

  • 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对比

全文检索

MongoDB支持执行字符串内容的文本搜索的查询操作。
1. 需要设置文本索引
   每个集合只能拥有一个文本索引
2. 使用搜寻运算符
     $text、$search
3. 在聚合管道中如何使用文本检索
4. 文本检索支持的语言
    支持英文、丹麦、法语等,不支持中文

存储过程

MongoDB存储过程和传统关系型数据库一样,将一个到多个指令保存成一段程序,调用时会根据程序中的指令进行操作。存储过程采用js程序来编写,存储在system.js集合中。
使用存储过程的步骤:
  • 创建一个存储过程
  • 加载存储过程
  • 查看存储过程
  • 执行存储过程
/*准备数据*/
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);

猜你喜欢

转载自blog.csdn.net/qq_33373609/article/details/121512102