mongodb使用aggregate、group、match实现mysql中的having(count(1)>1)的功能

关系型数据库中分组去重一般都是group by … having(count(1)>1)…赛选出来重复的记录组,然后一条sql搞定,但是在mongodb里面,没有这么方便了,需要自己写脚本来实现,可以通过aggregate、group、match来操作处理。

1,准备录入测试数据

db.stu.insert({cid:1,age:14,name:'gom1'});
db.stu.insert({cid:1,age:12,name:'jack2'});
db.stu.insert({cid:2,age:13,name:'Lily3'});
db.stu.insert({cid:2,age:14,name:'tony4'});
db.stu.insert({cid:2,age:9,name:'Harry5'});
db.stu.insert({cid:2,age:13,name:'Vincent6'});
db.stu.insert({cid:1,age:14,name:'bill7'});
db.stu.insert({cid:2,age:17,name:'tim8'});
db.stu.insert({cid:1,age:10,name:'bruce9'});
db.stu.insert({cid:3,age:20,name:'luxi10'});

执行窗口显示如下:

mongos> use test;
switched to db test
mongos> 
mongos> db.stu.insert({cid:1,age:14,name:'gom1'});
mongos> db.stu.insert({cid:1,age:12,name:'jack2'});
mongos> db.stu.insert({cid:2,age:13,name:'Lily3'});
mongos> db.stu.insert({cid:2,age:14,name:'tony4'});
mongos> db.stu.insert({cid:2,age:9,name:'Harry5'});
mongos> db.stu.insert({cid:2,age:13,name:'Vincent6'});
mongos> db.stu.insert({cid:1,age:14,name:'bill7'});
mongos> db.stu.insert({cid:2,age:17,name:'tim8'});
mongos> db.stu.insert({cid:1,age:10,name:'bruce9'});
mongos> db.stu.insert({cid:3,age:20,name:'luxi10'});

2,开始分组测试,按照cid进行分组

2.1,先统计分组记录数

var group=([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"cid", max_age: { m a x : " max:" max:"age"},count: { KaTeX parse error: Expected 'EOF', got '}' at position 8: sum: 1 }̲}}, {sort:{count:-1}}
])
执行窗口如下:

mongos> var group=([    
...      {$group:{_id:"$cid", max_age: {$max:"$age"},count: { $sum: 1 }}},
...      {$sort:{count:-1}}
... ])
mongos>
2.2,定义就是找出存在重复的分组,使用管道操作符 m a t c h , 条 件 是 普 通 查 询 的 格 式 , 但 是 作 用 于 match,条件是普通查询的格式,但是作用于 matchgroup的输出结果的格式:

var match ={“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":{"count" : {"gt” : 1}}};
执行窗口如下:

mongos> var match ={"$match":{"count" : {"$gt" : 1}}};
mongos>

3 获取数据

mongos> db.stu.aggregate(group, match);
{
	"result" : [
		{
			"_id" : 2,
			"max_age" : 17,
			"count" : 5
		},
		{
			"_id" : 1,
			"max_age" : 14,
			"count" : 4
		},
		{
			"_id" : 3,
			"max_age" : 20,
			"count" : 1
		}
	],
	"ok" : 1
}
mongos> 

PS:这里match无效,出来count为1的数据,没有match成功,问题在哪里呢?

网友Traveller的指点:
db.stu.aggregate(group, match); 看出来了吗?你这样调用相当于把match作为options传进去了,当然没有用,这种方法得不到最终的数据,因为每个管道是数组的一个元素,而group单独是一个数组,match是一个元素。除非把它加进数组里面,看如下写法,
group.push(match);
db.stu.aggregate(group);

然后自己去看官网进一步研究:
http://docs.mongoing.com/manual-zh/reference/method/db.collection.aggregate.html#db.collection.aggregate,查看了aggregate介绍,aggregate的方法签名是function (pipeline, aggregateOptions),
第一个参数是piplines,所有的对数据的判断条件都应该在这里面。
第二个参数是options,指定查询时候使用的一些选项。
The options document can contain the following fields and values:包括explain、allowDiskUse、cursor,所以我传入的match是针对group的判断条件,所以不能作为第二个参数,而应该放到第一个参数里面去,所以需要用到group的push功能,将match加入第一个参数里面去才能使count>1的判断生效。


4,使用group的push功能

mongos> group.push(match);
3
mongos> db.stu.aggregate(group);
{
	"result" : [
		{
			"_id" : 2,
			"max_age" : 17,
			"count" : 5
		},
		{
			"_id" : 1,
			"max_age" : 14,
			"count" : 4
		}
	],
	"ok" : 1
}
mongos> 

看到已经过滤掉了count=1的记录组了,表示push成功了。

### 回答1matchMongoDB中的聚合管道操作之一,其作用是用于筛选符合条件的文档。可以通过match操作在聚合管道中的第一个阶段筛选出符合条件的文档,然后再进行后续操作。match操作可以使用各种查询操作符和表达式,例如$gt,$lt,$in,$nin,$regex等。 ### 回答2: 在MongoDB中,aggregate是一个非常强大的工具,它可以对集合中的数据进行筛选、转换、排序、分组等多种操作。其中,matchaggregate中的一个非常重要的阶段,它可以根据指定的条件筛选出集合中符合要求的文档。 matchaggregate的第一个阶段,它的作用类似于find方法,可以根据指定的条件筛选出文档。match的语法与find非常相似,它也使用一个筛选器对象来表示筛选条件。match的作用是在第一个阶段中,对要聚合的数据进行初步的筛选,把无用的数据直接过滤掉,减少后续聚合操作的数据量,从而提高聚合查询的效率。 match可以支持各种复杂的条件筛选,例如匹配字符串、比较大小、逻辑运算等。同时,match还可以支持多个条件的嵌套,例如在一个条件下再添加一个条件,可以通过使用$and、$or等操作符来实现使用match可以提高查询效率,因为聚合查询通常需要处理大量的数据,如果不先进行筛选,将会浪费大量的计算资源,也会加长查询时间。在实际应用中,通常会结合其他聚合操作一起使用,例如$group、$project等,以实现更复杂的数据处理和分析需求。 总之,matchMongoDB aggregate中非常重要的一个阶段,它可以帮助我们快速筛选出符合条件的文档,从而提高聚合查询效率。在实际应用中,需要结合其他聚合操作一起使用,以实现更复杂的数据处理和分析需求。 ### 回答3: MongoDB的$match聚合操作符是用于筛选文档的操作符,它可以筛选出与指定条件匹配的文档。在使用$match聚合操作符时,需要将筛选条件作为参数传入,MongoDB将会返回一个包含所有满足条件的文档的容器,这个容器可以用于之后的各种聚合操作。 $match操作符的语法如下: ``` { $match: { <条件> } } ``` 其中,<条件>是用于筛选文档的条件表达式,可以是一个具体的值,也可以是一个组合条件的对象。使用$match操作符时,可以指定多个条件,这些条件可以使用逻辑运算符(如$and、$or、$not)进行组合。 $match操作符的应用场景比较广泛,常用于对特定字段进行条件筛选或者根据多个字段进行复杂的匹配。例如,可以使用$match操作符将指定范围内的文档筛选出来,或者根据文档的某些字段进行模糊匹配。 $match操作符也可以用于优化查询性能。因为在执行聚合操作前,MongoDB通常会先使用$match聚合操作符对文档进行筛选,然后再对符合条件的文档进行聚合操作。这样可以最大程度地减少需要处理的数据量,提高查询效率。 总之,$match操作符是MongoDB聚合操作中非常实用的一个操作符,使用它可以轻松地对文档进行筛选和优化查询效率。但是,在使用$match操作符时需要注意筛选条件的正确性和合理性,否则可能会影响查询结果的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值