mongodb如何返回符合查询条件的子文档

问题咨询 · liu23 · 于 5年前 发布 · 3692 次阅读

大家好,自从上次咨询过mongodb在项目应用的优点后使用mongodb有一段时间了,在一些简单的查询和统计上也算了解应如何使用。

但是这里碰到一个问题,就是例如我有这样一个文档:

[
	'order_id' => '2',
	'order_data' => [
		[
			'product_id' => '1',
			'product_price' => '2',
		],
		[
			'product_id' => '2',
			'product_price' => '4',
		],
		[
			'product_id' => '3',
			'product_price' => '6',
		],
		[
			'product_id' => '4',
			'product_price' => '8',
		],
		[
			'product_id' => '5',
			'product_price' => '10',
		],
	],
]

我需要对该订单里边价格大于5的商品进行统计并计算出总价,当然我可以先把文档提取出来再循环计算,但是我想利用mongodb的aggregate或者其它方法进行计算,但是不太能找到合适的方法,请问大神们这个情况mongodb的查询方法应该怎么写呢?

共收到 6 条回复
Fecmall#15年前 0 个赞

1.统计一般是后台脚本,计算完成后,放到存储表中

2.除了aggregate,如果不是即时计算,可以使用mongodb的mapreduce

3.这些统计函数,都有一个map函数,在map的时候,做数据的处理

4.订单本身就没有多少数据,一天几千条数据就很多了,统计数据一般都不是即时查询,都是计算完成后放到表里,然后去统计完成后的表中查询数据,因此也无所谓效率(前提是数据量不大)。

liu23#25年前 0 个赞

1、上面的问题可以这样解决:

[
	'$unwind' => 'order_data'
],
[
	'$match' => [
		'order_data.product_price' => [
			'$gt' => 5
		]
	]
],
[
	'$group' => [
		'_id' => 'order_id',
		'total' => [
			'$sum' => '$order_data.product_price'
		]
	]
]

2、问这个问题的时候其实还没怎么了解过aggregate,捣鼓了一段时间后觉得aggregate非常灵活

3、aggregate自带大量的表达式,可以写出很复杂的运算方法,这种运算统计如果用php后台脚本来写个人感觉非常丑陋和难以维护;

4、在即时查询上aggregate的处理速度比想象中快,不过这可能是项目的数据不太多的原因;现在的项目就是把订单保存成跟fecshop比较类似的结构,在各种查询上用aggregate来处理。

5、用aggregate实在开阔了眼界,个人感觉这比excel的统计功能还厉害

Fecmall#35年前 0 个赞

@liu23 #2楼

mongodb有aggregatemapreduce两种统计方式

mapreduce是线下处理数据的,可以处理千万以上的数据,限制小,还可以在mongo各个分片上面进行计算。

aggregate用于即时计算,使用的语法类似于linux中的管道,另外,使用还是有限制的,计算完的数据有mongodb文档的最大16MB的限制,另外比较耗费内存。 做即时统计,专业的还是elasticSearch,mongodb的aggregate前期是可以用的,如果数据量上来了,并发高了,可以改成elasticSearch

liu23#45年前 0 个赞

@Fecshop #3楼 那看来我了解的还不够多。。谢谢版主提供的方向!

liu23#55年前 0 个赞

@Fecshop #3楼 请问版主利用elasticSearch做即时统计后是否还有把数据储存在mongodb的必要?储存的数据更新比较频繁

Fecmall#65年前 0 个赞

如果做存储,可以用mapreduce,结果存储,然后,读取从结果数据中查询即可

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics