MongoDB-排序、索引、聚合

更新时间:2023-06-18 09:52:11 阅读: 评论:0

MongoDB-排序、索引、聚合
MongoDB
排序
使⽤sort()⽅法对数据进⾏排序,可以通过参数指定排序的字段,并可以指定排序⽅式(默认升序)
db = client['first_demo']
col = db['sites']
for doc in col.find({"alexa":{"$gt":'100'}}).sort('name', pymongo.DESCENDING):
print(doc)
索引
索引通常能够极⼤的提⾼查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个⽂件并选取那些符合查询条件的记录。
索引是特殊的数据结构,索引存储在⼀个易于遍历读取的数据集合中,索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构。
使⽤create_index来创建索引,参数为单个的(key, direction),或者它们的列表[(key, direction), (key2, direction2)]
col = db['profile']
mylist =[
{'ur_id':200,'name':'Tom'},
{'ur_id':201,'name':'Tommy'},
{'ur_id':202,'name':'Drew'},
{'ur_id':213,'name':'Zodiac'},
{'ur_id':220,'name':'Luke'},
{'ur_id':230,'name':'David'},
{'ur_id':204,'name':'James'},
{'ur_id':206,'name':'Paul'},
]
col.inrt_many(mylist)
for doc in col.find():
print(doc)
print(col.index_information())
# {'_id_': {'v': 2, 'key': [('_id', 1)], 'ns': 'first_demo.profile'}, 'name_1': {'v': 2, 'unique': True, 'key': [('name', 1)], 'ns': 'first_demo.profile'}}
index_information会返回当前集合的索引信息,形式为⼀个字典,key为索引的名称(在_id上的索引是MongoDB⾃动创建的,
在name上的索引是⽤户创建的),value是⼀个关于每个索引的信息的字典。
索引会阻⽌视图插⼊相同ur_id的⽂档:
>>> ur_profiles =[农民伯伯乡下妺
...{'ur_id':211,'name':'Luke'},
...{'ur_id':212,'name':'Ziltoid'}]
保护生态环境论文>>> result = db.profiles.inrt_many(ur_profiles)
>>> new_profile ={'ur_id':213,'name':'Drew'}
>>> duplicate_profile ={'ur_id':212,'name':'Tommy'}
>>> result = db.profiles.inrt_one(new_profile)# This is fine.
>>> result = db.profiles.inrt_one(duplicate_profile)
Traceback (most recent call last):
DuplicateKeyError: E11000 duplicate key error index: test_databa.profiles.$ur_id_1 dup key:{:212}
聚合
MongoDB中聚合(aggregate)操作处理数据记录并返回计算结果。 聚合操作将来⾃多个⽂档的值组合在⼀起,并且可以对分组数据执⾏各种操作以返回单个结果。 MongoDB提供了三种执⾏聚合的⽅法:聚合管道,map-reduce函数和单⽤途聚合⽅法。
基本语法:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
数据:
{
"_id" : ObjectId("5c047e878c70ac29935dbb92"),
"cust_id" : "A122",
"amount" : 123,
"status" : "A"
}
{
"_id" : ObjectId("5c047e878c70ac29935dbb93"),
"cust_id" : "A122",
"amount" : 500,
"status" : "A"
}
{
"_id" : ObjectId("5c047e878c70ac29935dbb94"),
加工误差
"cust_id" : "B112",
"amount" : 300,
"status" : "A"
}
{
"_id" : ObjectId("5c047e878c70ac29935dbb95"),
"cust_id" : "B112",
"amount" : 200,
"status" : "B"
}
使⽤aggregate()计算每个customer的amount和值:
> db.orders.aggregate([{$group : {_id: "$cust_id", total : {$sum: '$amount'}}}])
{ "_id" : "B112", "total" : 500 }
{ "_id" : "A122", "total" : 623 }
类似sql语句
lect cust_id,count(amount)from mycol group by cust_id
聚合表达式:
$sum:计算和值;
$avg:计算平均值
$min:获取集合中所有⽂档对应值得最⼩值
$max:获取集合中所有⽂档对应值得最⼤值
$push:在结果⽂档中插⼊值到⼀个数组中
$addToSet:在结果⽂档中插⼊值到⼀个数组中,但不创建副本
$first:根据资源⽂档的排序获取第⼀个⽂档数据
$last:根据资源⽂档的排序获取最后⼀个⽂档数据
聚合管道
管道在Unix和Linux中⼀般⽤于将当前命令的输出结果作为下⼀个命令的参数。MongoDB聚合管道由阶段(stages)组成。 每个阶段在⽂档通过管道时转换⽂档。 管道阶段不需要为每个输⼊⽂档⽣成⼀个输出⽂档; 例如,某些阶段可以⽣成新⽂档或过滤掉⽂档。 管道阶段可以在管道中多次出现。。官⽅⽰例:
⼏个常⽤的stages:
MongoDB Aggregation
Operators
含义SQL
中国灵异故事
$project 修改输⼊⽂档的结构。可以⽤来重命名、增加或删除域,也可以⽤于创建计算结果以及嵌
套⽂档
SELECT
$match⽤于过滤数据,只输出符合条件的⽂档。$match使⽤MongoDB的标准查询操作WHERE,HAVING
$limit⽤来限制MongoDB聚合管道返回的⽂档数LIMIT
$skip在聚合管道中跳过指定数量的⽂档,并返回余下的⽂档
$unwind将⽂档中的某⼀个数组类型字段拆分成多条,每条包含数组中的⼀个值
$group将集合中的⽂档分组,可⽤于统计结果GROUP BY
垂柳依依$sort将输⼊⽂档排序后输出ORDER BY
$sum求和COUNT 具体查看
1. $project实例:
> db.orders.aggregate({$project:{cust_id: 1, status: 1}})
{ "_id" : ObjectId("5c047e878c70ac29935dbb92"), "cust_id" : "A122", "status" : "A" }
{ "_id" : ObjectId("5c047e878c70ac29935dbb93"), "cust_id" : "A122", "status" : "A" }
{ "_id" : ObjectId("5c047e878c70ac29935dbb94"), "cust_id" : "B112", "status" : "A" }
{ "_id" : ObjectId("5c047e878c70ac29935dbb95"), "cust_id" : "B112", "status" : "B" }
>
结果中就只还有_id,cust_id和status三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以使⽤_id: 0
2. $match实例:
> db.orders.aggregate([{$match: {status : "A"}},
{$group: {_id:"$cust_id",total:{$sum:"$amount"}}}])一个人开什么店好
{ "_id" : "B112", "total" : 300 }
{ "_id" : "A122", "total" : 623 }
$ match ⽤于获取status为‘A’的记录,然后将符合条件的记录送到下⼀阶段$group管道操作符进⾏处理。
3. $skip实例
> db.orders.aggregate({$skip: 2})
{ "_id" : ObjectId("5c047e878c70ac29935dbb94"), "cust_id" : "B112", "amount" : 300, "status" : "A" }
{ "_id" : ObjectId("5c047e878c70ac29935dbb95"), "cust_id" : "B112", "amount" : 200, "status" : "B" }
前2个⽂档被跳过了。
python 实例:
import pprint
from bson.son import SON
pipleline =[
{'$match':{'status':'A'}},
{'$group':{'_id':'$cust_id','total':{'$sum':'$amount'}}},
{'$sort': SON([('total',1)])}
]
ret = col.aggregate(pipleline)
pprint.pprint(list(ret))
# [{'_id': 'B112', 'total': 300}, {'_id': 'A122', 'total': 623}]
由于python词典没有顺序,所以当需要显式地排序(例如$sort)时,要使⽤collections.OrderedDict 或者 SON。
Map-Reduce
Map-reduce是⼀种数据处理范例,⽤于将⼤量数据压缩为有⽤的聚合结果。 对于map-reduce操作,MongoDB提供了mapReduce数据库命令。
在此map-reduce操作中,MongoDB将映射阶段应⽤于每个输⼊⽂档(即集合中与查询条件匹配的⽂档)。 map函数发出键值对。 对于具有多个值的key,MongoDB应⽤reduce阶段,该阶段收集并压缩聚合数据。然后MongoDB将结果存储在⼀个集合中。reduce函数的输出可以选择性地通过finalize函数以进⼀步压缩或处理聚合的结果。
python实现:
de import Code
mapper = Code("""
function () {
emit(this.cust_id, this.amount);
}
""")
reducer = Code("""
function (key, values) {
return Array.sum(values)
}
""")
result = col.map_reduce(mapper, reducer,'myresult')
for doc in result.find():
pprint.pprint(doc)
# {'_id': 'A122', 'value': 623.0}
# {'_id': 'B112', 'value': 500.0}
在数据库中查询’myresult’青春的颜色作文
> db.myresult.find()
{ "_id" : "A122", "value" : 623 }
{ "_id" : "B112", "value" : 500 }
>
使⽤full_respon=True参数可以获取更详细的信息:
result = col.map_reduce(mapper, reducer,'myresult', full_respon=True)
print(result)
result结果
{'result':'myresult','timeMillis':40,'counts':{'input':4,'emit':4,'reduce':2,'output':2},'ok':1.0}
还可以使⽤query参数限制被mapper映射的⽂档:
query ={'status':'A'}
水瓶座守护神result = col.map_reduce(mapper, reducer,'myresult_1', query=query)
for doc in result.find():
pprint.pprint(doc)
指定条件status为‘A’ ,结果:
{'_id':'A122','value':623.0}
{'_id':'B112','value':300.0}
单⼀⽤途的聚合函数
MongoDB 提供llection.estimatedDocumentCount(), unt() 和 db.collection.distinct() 这3个单⼀⽤途的聚合函数,它们的操作对象都是单⼀集合
print(f"counts: {unt()}")
print(f"distinct: {col.distinct('cust_id')}")
print(f"estimate num: {col.estimated_document_count()}")
# counts: 4
# distinct: ['A122', 'B112']
# estimate num: 4

本文发布于:2023-06-18 09:52:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/982340.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:聚合   管道   排序   阶段   数据   操作
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图