Python使用MongoDB的基本操作(二)

MongoDB关系表示多个文档之间在逻辑上的相互关系。表示1:1,1:n,n:1,n:n。
一个同学有多门课程

Student:
{u'age': 10, u'_id': ObjectId('5cff13917ebced1b4c7f7181'), u'name': u'zhangsan'}
Grade:
{u'classname': u'java', u'_id': ObjectId('5cff13917ebced1b4c7f7182'), u'teacher': u'lilaoshi'}

1、嵌入式:
把成绩的信息嵌入到文档中,优点是好维护,缺点是当成绩变多,学生变多的时候,数据冗余

{
	'grade': [{
		'classname': 'php',
		'teacher': 'lilaoshi'
	}, {
		'classname': 'java',
		'teacher': 'lilaoshi'
	}],
	'age': 10,
	'_id': ObjectId('5cff157abf41e4c4662addd9'),
	'name': 'zhangsan'
}

这样可以通过my_set.find({‘name’:‘zhangsan’},{‘grade’:1})来查到对应课程。

2、引用式关系
通过引用文档的id字段来建立关系,类似于关系型数据库中的外键。
使用MongoDB的DBRefs的引用:
形式:{ r e f : , ref:, ref:,id:,$db:}
例:

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "集合名",
   "$id": ObjectId("534009e4d852427820000002"),
   "$db": "数据库名"},
   "name": "zhangsan"
}

3、MongoDB 查询分析常用函数有:explain() 和 hint()。
4、MongoDB Map Reduce
实现MapReduce需要先实现两个函数,分别是map函数和reduce函数,其中map函数调用emit(key,value),遍历collection中所有的数据,将key和value传给reduce函数进行处理。

db.collection.mapReduce(
   function() {emit(key,value);},  //map 函数
   function(key,values) {return reduceFunction},   //reduce 函数,将key-values变成key-value,也就是把values数组变成一个单一的值value。
   {
      out: collection, //统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
      query: document,//一个筛选条件
      sort: document,
      limit: number
   }
)

备注:首先通过query查到对应数据,通过map函数将制定的key和value数组(与key对应)传给reduce函数,其中key,value是你query查到的字段,然后在reduce中对value数组作出处理。out将结果存放如集合。
查询每个用户,买了多少商品,总价格,及评价价格 条件是价格大于5的

 # for i in xrange(1000):
#     rID = math.floor(random.random() * 10)
#     price = round(random.random() * 10, 2)
#     if rID < 4:
#         my_set.insert({"_id": i, "user": "Joe", "product": rID, "price": price})
#     elif rID >= 4 and rID < 7:
#         my_set.insert({"_id": i, "user": "Josh", "product": rID, "price": price});
#     else:
#         my_set.insert({"_id": i, "user": "Ken", "product": rID, "price": price});
mapper = Code("function(){emit(this.user,{amount:this.price,count:1,avgPrice:0})}")
reduce = Code("function(key,values){ "
              "var res={amount:0,count:0,avgPrice:0};"
              "for (var i = 0; i < values.length; i++) {"
                    "res.count += values[i].count;"
                    "res.amount += values[i].amount;"
              "} "
              "res.avgPrice = (res.amount/res.count).toFixed(2);"
              "return res;}"
              )
result = my_set.map_reduce(mapper,reduce,query={'price':{'$gt':6}},out = 'myresults')
col =my_set = collectionMongo.mySet('sun','myresults')
for j in col.find():
    print j
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值