MongoDB中数组练习
一、运行以下代码,生成原始数据
import random
from pymongo import MongoClient
client = MongoClient().shuzu.example
name_list = ['衬衣', '裤子', '鞋子', '帽子']
size_list = ['S', 'M', 'L', 'XL']
price_list = [100, 200, 300, 600, 800]
for i in range(10):
random_ = random.randint(2, 4)
client.insert_one({
'name': random.choice(name_list),
'size': random.sample(size_list, random_),
'price': random.sample(price_list, random_)
})
二、练习要求:
TIP:利用 $1t,$gt,$ne,$gte等操作符
利用数组的索引特性,能够定位到数据的具体数据,比如price.0
可以直接在robo3t上完成
1、查询所有size不包含M的记录
> db.example.find({size:{$nin:["M"]}})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea54"), "name" : "帽子", "size" : [ "L", "XL" ], "price" : [ 300, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea57"), "name" : "鞋子", "size" : [ "XL", "L" ], "price" : [ 800, 300 ] }
2、查询price至少有一个元素在200~300之间
> db.example.find({$and:[{price:{$gte:NumberInt(200)}},{price:{$lte:NumberInt(300)}}]})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea4e"), "name" : "衬衣", "size" : [ "S", "M", "XL", "L" ], "price" : [ 200, 100, 600, 300 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea4f"), "name" : "衬衣", "size" : [ "XL", "M", "S" ], "price" : [ 200, 800, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea50"), "name" : "裤子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 800, 100, 300, 200 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea51"), "name" : "鞋子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 600, 300, 200, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea52"), "name" : "帽子", "size" : [ "L", "M", "XL" ], "price" : [ 100, 300, 800 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea53"), "name" : "帽子", "size" : [ "S", "L", "XL", "M" ], "price" : [ 200, 300, 600, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea54"), "name" : "帽子", "size" : [ "L", "XL" ], "price" : [ 300, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea55"), "name" : "衬衣", "size" : [ "M", "XL", "S", "L" ], "price" : [ 300, 200, 600, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea56"), "name" : "裤子", "size" : [ "M", "XL", "L" ], "price" : [ 300, 100, 800 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea57"), "name" : "鞋子", "size" : [ "XL", "L" ], "price" : [ 800, 300 ] }
> db.example.find({price:{$gte:200,$lte:300}})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea4e"), "name" : "衬衣", "size" : [ "S", "M", "XL", "L" ], "price" : [ 200, 100, 600, 300 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea4f"), "name" : "衬衣", "size" : [ "XL", "M", "S" ], "price" : [ 200, 800, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea50"), "name" : "裤子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 800, 100, 300, 200 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea51"), "name" : "鞋子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 600, 300, 200, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea52"), "name" : "帽子", "size" : [ "L", "M", "XL" ], "price" : [ 100, 300, 800 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea53"), "name" : "帽子", "size" : [ "S", "L", "XL", "M" ], "price" : [ 200, 300, 600, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea54"), "name" : "帽子", "size" : [ "L", "XL" ], "price" : [ 300, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea55"), "name" : "衬衣", "size" : [ "M", "XL", "S", "L" ], "price" : [ 300, 200, 600, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea56"), "name" : "裤子", "size" : [ "M", "XL", "L" ], "price" : [ 300, 100, 800 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea57"), "name" : "鞋子", "size" : [ "XL", "L" ], "price" : [ 800, 300 ] }
3、查询所有price字段长度为2的记录
> db.example.find({price:{$size:2}})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea54"), "name" : "帽子", "size" : [ "L", "XL" ], "price" : [ 300, 600 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea57"), "name" : "鞋子", "size" : [ "XL", "L" ], "price" : [ 800, 300 ] }
4、所有size第1个数据为S的记录
> db.example.find({"size.0":"S"})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea4e"), "name" : "衬衣", "size" : [ "S", "M", "XL", "L" ], "price" : [ 200, 100, 600, 300 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea53"), "name" : "帽子", "size" : [ "S", "L", "XL", "M" ], "price" : [ 200, 300, 600, 100 ] }
5、price第1个数据大于500的记录
> db.example.find({"price.0":{$gt:500}})
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea50"), "name" : "裤子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 800, 100, 300, 200 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea51"), "name" : "鞋子", "size" : [ "M", "XL", "L", "S" ], "price" : [ 600, 300, 200, 100 ] }
{ "_id" : ObjectId("5fc1b4e597852f20e2cdea57"), "name" : "鞋子", "size" : [ "XL", "L" ], "price" : [ 800, 300 ] }
mongodb分组操作
一、根据以下代码生成数据
import random
from pymongo import MongoClient
client = MongoClient().fenzu.example
name_list = ['张三', '李四', '王五', '赵六']
date_list = ['2018/6/1', '2018/6/2', '2018/6/3', '2018/6/4']
for i in range(20):
client.insert_one({
'name': random.choice(name_list),
'date': random.choice(date_list),
'score': random.randint(50, 100)
})
# 运行后的数据如下所示:
> db.example.find()
{ "_id" : ObjectId("5fc885939400eb511abb08c5"), "name" : "张三", "date" : "2018/6/2", "score" : 71 }
{ "_id" : ObjectId("5fc885939400eb511abb08c6"), "name" : "王五", "date" : "2018/6/4", "score" : 76 }
{ "_id" : ObjectId("5fc885939400eb511abb08c7"), "name" : "赵六", "date" : "2018/6/2", "score" : 54 }
{ "_id" : ObjectId("5fc885939400eb511abb08c8"), "name" : "李四", "date" : "2018/6/4", "score" : 97 }
{ "_id" : ObjectId("5fc885939400eb511abb08c9"), "name" : "李四", "date" : "2018/6/1", "score" : 79 }
{ "_id" : ObjectId("5fc885939400eb511abb08ca"), "name" : "张三", "date" : "2018/6/3", "score" : 82 }
{ "_id" : ObjectId("5fc885939400eb511abb08cb"), "name" : "李四", "date" : "2018/6/3", "score" : 88 }
{ "_id" : ObjectId("5fc885939400eb511abb08cc"), "name" : "张三", "date" : "2018/6/3", "score" : 100 }
{ "_id" : ObjectId("5fc885939400eb511abb08cd"), "name" : "李四", "date" : "2018/6/1", "score" : 89 }
{ "_id" : ObjectId("5fc885939400eb511abb08ce"), "name" : "李四", "date" : "2018/6/3", "score" : 98 }
{ "_id" : ObjectId("5fc885939400eb511abb08cf"), "name" : "赵六", "date" : "2018/6/2", "score" : 70 }
{ "_id" : ObjectId("5fc885939400eb511abb08d0"), "name" : "李四", "date" : "2018/6/2", "score" : 100 }
{ "_id" : ObjectId("5fc885939400eb511abb08d1"), "name" : "张三", "date" : "2018/6/2", "score" : 70 }
{ "_id" : ObjectId("5fc885939400eb511abb08d2"), "name" : "赵六", "date" : "2018/6/1", "score" : 76 }
{ "_id" : ObjectId("5fc885939400eb511abb08d3"), "name" : "张三", "date" : "2018/6/3", "score" : 56 }
{ "_id" : ObjectId("5fc885939400eb511abb08d4"), "name" : "张三", "date" : "2018/6/1", "score" : 75 }
{ "_id" : ObjectId("5fc885939400eb511abb08d5"), "name" : "李四", "date" : "2018/6/3", "score" : 63 }
{ "_id" : ObjectId("5fc885939400eb511abb08d6"), "name" : "李四", "date" : "2018/6/2", "score" : 71 }
{ "_id" : ObjectId("5fc885939400eb511abb08d7"), "name" : "王五", "date" : "2018/6/4", "score" : 83 }
{ "_id" : ObjectId("5fc885939400eb511abb08d8"), "name" : "赵六", "date" : "2018/6/3", "score" : 69 }
二、操作要求
1、统计每个人的记录数量
> db.example.aggregate([{$group:{_id:"$name",countnum:{$sum:1}}}])
{ "_id" : "李四", "countnum" : 8 }
{ "_id" : "赵六", "countnum" : 4 }
{ "_id" : "王五", "countnum" : 2 }
{ "_id" : "张三", "countnum" : 6 }
2、所有分数大于70,只返回name和score
> db.example.find({score:{$gt:70}},{name:1,score:1,_id:0})
{ "name" : "张三", "score" : 71 }
{ "name" : "王五", "score" : 76 }
{ "name" : "李四", "score" : 97 }
{ "name" : "李四", "score" : 79 }
{ "name" : "张三", "score" : 82 }
{ "name" : "李四", "score" : 88 }
{ "name" : "张三", "score" : 100 }
{ "name" : "李四", "score" : 89 }
{ "name" : "李四", "score" : 98 }
{ "name" : "李四", "score" : 100 }
{ "name" : "赵六", "score" : 76 }
{ "name" : "张三", "score" : 75 }
{ "name" : "李四", "score" : 71 }
{ "name" : "王五", "score" : 83 }
3、计算每个人得分的最大值、最小值、得分之和还有平均分
> db.example.aggregate([{$group:{_id:"$name",maxnum:{$max:"$score"},minnum:{$min:"$score"},sumnum:{$sum:"$score"},avgnum:{$avg:"$score"}}}])
{ "_id" : "李四", "maxnum" : 100, "minnum" : 63, "sumnum" : 685, "avgnum" : 85.625 }
{ "_id" : "赵六", "maxnum" : 76, "minnum" : 54, "sumnum" : 269, "avgnum" : 67.25 }
{ "_id" : "王五", "maxnum" : 83, "minnum" : 76, "sumnum" : 159, "avgnum" : 79.5 }
{ "_id" : "张三", "maxnum" : 100, "minnum" : 56, "sumnum" : 454, "avgnum" : 75.66666666666667 }