MongoDB——聚合管道之$match和$count操作

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB——聚合管道之$match和$count操作相关的知识,希望对你有一定的参考价值。

目录

一、聚合管道之$match的概述

  • $ match用于对文档进行筛选,之后可以在得到的文档子集上做聚合,$ match可以使用除了地理空间之外的所有常规查询操作符,在实际应用中尽可能将$ match放在管道的前面位置。这样有两个好处:一是可以快速将不需要的文档过滤掉,以减少管道的工作量;二是如果再投射和分组之前执行$match,查询可以使用索引。
  • 筛选管道操作和其他管道操作配合时候时,尽量放到开始阶段,这样可以减少后续管道操作符要操作的文档数,提升效率。

二、聚合管道之$count的概述

  • 计数并返回与查询匹配的结果数。

三、数据准备

  • 准备数据集,执行脚本

    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++)
    	var typeIdx = Math.floor(Math.random()*types.length);
    	var tagIdx = Math.floor(Math.random()*tags.length);
    	var tagIdx2 = Math.floor(Math.random()*tags.length);
    	var favCount = Math.floor(Math.random()*100);
    	var username = "xx00"+Math.floor(Math.random()*10);
    	var age = 20 + Math.floor(Math.random()*15);
    	var book = 
    		title: "book-"+i, 
    		type: types[typeIdx],
    		tag: [tags[tagIdx],tags[tagIdx2]],
    		favCount: favCount, 
    		author: name:username,age:age
    	;
    	books.push(book)
    
    db.books1.insertMany(books);
    

四、聚合管道之$match操作示例

  • 查询books1集合中的数据

    > db.books1.find()
    

  • 查询books1集合中type字段为technology的所有数据

    db.books1.aggregate([$match:type:"technology"])
    

五、聚合管道之$count的示例

  • 查询books1集合中的数据

    > db.books1.find()
    

  • 计数并返回与查询匹配的结果数

    (1)、$ match阶段筛选出type匹配technology的文档,并传到下一阶段;
    (2)、$ count阶段返回聚合管道中剩余文档的计数,并将该值分配给type_count

    db.books1.aggregate([ $match:type:"technology", $count: "type_count" ])
    

以上是关于MongoDB——聚合管道之$match和$count操作的主要内容,如果未能解决你的问题,请参考以下文章

mongodb Aggregation聚合操作之$sort

mongodb3 之单一用途聚合

MongoDB $geoNear 聚合管道(使用查询选项和使用 $match 管道操作)给出不同的结果

Mongodb 聚合管道优化 - $match 的 2 阶段

MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”

MongoDB 聚合管道 $match order