python+mongodb简单操作记录

最近写爬虫用到的是mongodb数据库,部署在阿里云的服务器,下面简单记录一下用到的操作,已被后用。(关于mongodb的安装配置参考其他资料,后续补充)

基本操作:


def find_data():
    print("init mongo")
    client = MongoClient(ip)
    db = client[database]
    db.authenticate(user, pwd)
    c = db[collection]
    # c.create_index("movieid", unique=True)
    #  其余操作  
    client.close()
复制代码
插入:

可以使用insert_one或者insert_many插入多条数据,但是我插入的数据经常会有重复,因此想到两种解决方法。 以豆瓣电影的一条记录来说:

首先建立唯一索引: c.create_index("movieid", unique=True)

  1. 利用try catch来保证唯一插入,try catch也可用于其他异常处理
try:
   insert_one   #说明有相同记录
except e:
   print(e)
复制代码
  1. upsert命令:
collection.update_one({"movieid": movieid}, {"$set": item}, upsert=True)
复制代码

上述用于更新一条记录,不存在则插入。{"$set": item}, 全部更新,也可选择部分更新。

查找find操作

  1. results = c.find().count()用于记录,find中可以加条件。
mark = "wish_count"
results = c.find({"subtype": "tv", mark: {"$gte": 10000, "$lte": 30000}}, {"_id": 0, "title": 1, "rate": 1, mark: 1}).sort([("rate", -1), (mark, -1)])
复制代码

这条语句的意思是;根据subtype=“tv”mark10000~30000之间进行查找,结果中不显示_id 字段(find的第二个参数,0不显示,1显示), 显示titlerate字段。 结果按照rate, mark的顺序降序排列(1为升序)。

  1. results = c.find({"title": {"$regex": "大明"}}) 类似like操作,查找title包含大明的集合。

  2. results = c.find({"casts": {"$in": ["1", "2"]}}) 查找集合中演员列表存在1, 2字段的集合。

组合操作:

    pipeline = [
        {"$match": {"subtype": "tv"}},
        {"$unwind": "$casts"},
        {"$group": {"_id": "$casts", "count": {"$sum": 1}, "avg": {"$avg": "$rate"}}},
        {"$sort": {"avg": -1}},
        # {"$match": {"count": {"$gte": 3, "$lte": 4}}}
        {"$match": {"_id": "鹿晗"}}
    ]
    results = c.aggregate(pipeline)
复制代码

组合操作: 第一个matchfind的第一个参数一样,用于组合前筛选。 unwind:展开,用于该字段是列表时,展开进行组合操作,不是列表可省略。 group_id是必须字段,countavg自定义字段, sumavg分别是求和,求平均操作。 sort关键字不在叙述。 后面match用于组合后筛选, gte是大于等于,lte是小于等于字段。

综上:这条操作的意思是: 对subtype=“tv”的集合进行操作,展开casts字段,对其进行组合,计算出现次数count, 对集合的rate求平均值。结果按照平均值排序,并筛选出count在3~4之间的集合(_id=“鹿晗”)

后续用到再补充,具体其他操作请查看官方文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值