我有一个查询将结果(大数据集〜= 11Gb)按值(vessel_id)分组,并为每个容器返回数组中的坐标。
查询如下所示:
pipeline = [{"$group": {"_id": "$properties.vessel_id",
"COORDINATES": {
"$push": "$geometry.coordinates"}}}]
getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)
输出是:
{u'_id': u'566679000', u'COORDINATES': [[154.666, -16.643], [154.666, -16.643], [154.666, -16.643]]}
{u'_id': u'636015725', u'COORDINATES': [[151.5162, -9.44365], [151.5162, -9.44365], [151.5162, -9.44365]]}
{u'_id': u'525018017', u'COORDINATES': [[117.3803, -1.029925], [117.3803, -1.029925], [117.3803, -1.029925]]}
总的来说,数据集包含41000个vessel_id。我观察到,获取所有容器的输出的时间几乎与获取500个容器的输出的时间相等。
例如,使用$limit:500
执行查询的时间几乎与使用$limit:41000
执行查询的时间相等:
pipeline = [{"$group": {"_id": "$properties.vessel_id",
"COORDINATES": {
"$push": "$geometry.coordinates"}}},
{"$limit":500}]
getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)
时间:720秒
pipeline = [{"$group": {"_id": "$properties.vessel_id",
"COORDINATES": {
"$push": "$geometry.coordinates"}}},
{"$limit":41000}]
getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)
时间:780秒
我想念的是什么?是我做错了吗?
看到这个例子
db.collection.distinct('vessel_id').limit(10000)
db.collection.aggregate([
{ $match: { vessel_id: vessel_id }},
{"$group": {"_id": "$properties.vessel_id",
"COORDINATES": {
"$push": "$geometry.coordinates"}}}
])