PyMongo使用入门(二)

来源:互联网 发布:mac fifa 编辑:程序博客网 时间:2024/06/18 06:16

聚合管道和MapReduce知识点

import pymongofrom bson import Codefrom pymongo import MongoClientfrom bson.objectid import ObjectIdfrom bson.son import SONimport datetimeclient = MongoClient('localhost', 27017)db = client.PymongoDemo"""result = db.things.insert_many([{"x": 1, "tags": ["dog", "cat"]},                              {"x": 2, "tags": ["cat"]},                              {"x": 2, "tags": ["mouse", "cat", "dog"]},                              {"x": 3, "tags": []}])print(result.inserted_ids)""""""管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit:用来限制MongoDB聚合管道返回的文档数。$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$group:将集合中的文档分组,可用于统计结果。$sort:将输入文档排序后输出。$geoNear:输出接近某一地理位置的有序文档。"""pipeline = [     {"$unwind": "$tags"},     {"$group": {"_id": "$tags", "count": {"$sum": 1}}},     {"$sort": SON([("count", -1), ("_id", -1)])}     ]"""以上实例类似sql语句: select tags, count(*) from things group by tags"""print(list(db.things.aggregate(pipeline)))"""使用command()方法 要运行这种聚合的执行计划:"""print(db.command('aggregate', 'things', pipeline=pipeline, explain=True))print("-"*20)mapper = Code("""               function () {                  this.tags.forEach(function(z) {                  emit(z, 1);                 });               }                """)reducer = Code("""                function (key, values) {                  var total = 0;                  for (var i = 0; i < values.length; i++) {                    total += values[i];                  }                  return total;                }                """)"""最后我们调用map_reduce()和遍历结果集"""result = db.things.map_reduce(mapper, reducer, "myresults")for doc in result.find():    print(doc)print("-"*20)#高级 Map/Reducedb.things.map_reduce(mapper, reducer, "myresults", full_response=True)result = db.things.map_reduce(mapper, reducer, "myresults", query={"x": {"$lt": 2}})for doc in result.find():    print(doc)print("-"*20)# db.things.map_reduce(mapper, reducer, out=SON([("replace", "results"), ("db", "outdb")]), full_response=True)"""group()方法提供了一些相同的功能SQL的GROUP BY。比map reduce简单,需要提供一个键到分组,作为聚集的初始值和reduce函数。"""reducer = Code("""                function(obj, prev){                  prev.count++;                }                """)results = db.things.group(key={"x":1}, condition={}, initial={"count": 0}, reduce=reducer)for doc in results:    print(doc)

运行结果如图:

这里写图片描述

0 0