mongodb & pymongo

mongodb

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

集合:对应数据库表

文档:对应数据库一条数据

插入文档

save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。

insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()

mongodb-insertOne
db.getCollection('test').insertOne({"price": 15, "number": 10, "name": "apple"})

mongodb-insertOne

db.getCollection('test').insertMany([{"price": 15, "number": 10, "name": "apple"}, {"price": 10, "number": 20, "name": "orange"}])
pymonodb-insert
import pymongo

host = "xxx"
port = 30019
db = pymongo.MongoClient(host=host, port=port)

# 集群
# pymongo.MongoClient("192.168.234.241:30019,192.168.234.241:30019")

# 获取所有数据库
db.database_names()

# test 数据库不存在则创建,有数据插入才会真实创建
db["test"]

# 获取数据库的集合
db["test"].collection_names()

# test 集合不存在则创建,有数据插入才会真实创建
document = db["test"]["test"]

# insert_one
db.get_database("jenkins").get_collection('test').insert_one({"price": 15, "number": 10, "name": "apple"})

# insert_many
db.get_database("jenkins").get_collection('test').insert_many([{"price": 5, "number": 10, "name": "watermelon"}, {"price": 10, "number": 30, "name": "grape"}])

# insert
db.get_database("jenkins").get_collection('test').insert([{"price": 5, "number": 11, "name": "plum"}])
db.get_database("jenkins").get_collection('test').insert({"price": 5, "number": 11, "name": "plum"})
db.get_database("jenkins").get_collection('test').insert([{"price": 5, "number": 10, "name": "pear"}, {"price": 20, "number": 20, "name": " strawberry "}])

# 集合更新文档
db.getCollection('job').update({"_id": "2021-11-33-15-46-31"}, {"status": "test"}, true)

# db.collection.update(criteria,objNew,upsert,multi)
# criteria 查询条件
# objNew 更新数据 
# upsert 如果不存在update的记录,是否插入objNew这个新的document。true为插入,默认是false,不插入。
# multi 默认是false,只更新找到的第一条记录。如果为true,按条件查出来的多条记录全部更新。

查询
条件
  • {:{$lt:}} 小于
  • {:{$gt:}} 大于
  • {:{$gte:}} 大于等于
  • {:{$lte:}} 小于等于
  • {:{$ne:}} 不等于
  • {$or: [{key1: value1}, {key2:value2}]} or
  • {{key1: value1}, {key2:value2}} and
  • {“key”: {“$in”: [value]}}
  • {“key”: {“$nin”: [value]}}
  • {“$regex”: “”} 正则表达
  • {“$not”: “”}
mongodb-find
db.getCollection('test').find({"price": {"$gt": 10}})

db.getCollection('test').find({"price": {"$gt": 10}, "number": {"$lt": 20}})

db.getCollection('test').find({$or: [{"price": {"$gt": 5}}, {"number": {"$lt": 20}}]})

db.getCollection('test').find({"price": {"$in": [10, 15]}})

db.getCollection('test').find({"price": {"$nin": [10, 15]}})

db.getCollection('job').find({"projectBranch": {"$regex": "\\d{1}"}})

db.getCollection('job').find({"projectBranch": {$not: {"$regex": "\\d{1}"}}})
pymongo-find
# 大于
response = db.get_database("jenkins").get_collection('test').find({"price": {"$gt": 10}})
print(list(response))

# and
response = db.get_database("jenkins").get_collection('test').find({"price": {"$gt": 10}, "number": {"$lt": 20}})
print(list(response))

# or
response = db.get_database("jenkins").get_collection('test').find({"$or": [{"price": {"$gt": 5}}, {"number": {"$lt": 20}}]})
print(list(response))

# in
response = db.get_database("jenkins").get_collection('test').find({"price": {"$in": [10, 15]}})
print(list(response))

# nin
response = db.get_database("jenkins").get_collection('test').find({"price": {"$nin": [10, 15]}})
print(list(response))

# regex
response = db.get_database("jenkins").get_collection('job').find({"projectBranch": {"$regex": "\\d{1}"}})
print(list(response))

# not
response = db.get_database("jenkins").get_collection('job').find({"projectBranch": {"$not": {"$regex": "\\d{1}"}}})
print(list(response))

# 集合查询
collection.find({"_id": "2021-11-26-15-13-46"}, {"_id": 1})
# db.collection.find(query, projection)
# query 	是可选参数,基于查询操作符指定了查询的条件
# projection 返回的字段,1为要返回,0位不返回,1和0不能同时使用
# collection.find({"_id": "2021-11-26-15-13-46"}, {"_id": 0, "userName": 0}) 正确
# collection.find({"_id": "2021-11-26-15-13-46"}, {"_id": 1, "userName": 0}) 错误

排序、skip、limit

# sort 1 为升序排列,而 -1 是用于降序排列。
# skip 跳过多少条
#  limit 取多少条
db.getCollection('job').find({"projectBranch": {$not: {"$regex": "\\d{1}"}}}).sort({"projectBranch": 1}).skip(1).limit(2)
# 顺序无关
db.getCollection('job').find({"projectBranch": {$not: {"$regex": "\\d{1}"}}}).sort({"projectBranch": 1}).limit(2).skip(1)

聚合

表达式
  • $sum
  • $max
  • $min
  • $avg
  • $push 将值加入一个数组中,不会判断是否有重复的值
  • $addToSet 将值加入一个数组中,判断是否有重复的值
  • $ first 第一个
  • $ last 最后一个
# 已libBranch 分组,统计个数
db.getCollection('job').aggregate([{$group : {_id : "$libBranch", num_tutorial : {$sum : 1}}}])
管道
  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • m a t c h :用于过滤数据,只输出符合条件的文档。 match:用于过滤数据,只输出符合条件的文档。 match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档
mongodb-aggregate
db.getCollection('job').aggregate([{$match : {"projectBranch": {"$regex": "\\d{1}"}}}, {"$project": {"status": 1}}])

db.getCollection('job').aggregate([{$match : {"projectBranch": {"$regex": "\\d{1}"}}}, {"$project": {"status": 1}}, {"$skip": 1}, {"$limit": 2}])

# 顺序是有区别的
db.getCollection('job').aggregate([{$match : {"projectBranch": {"$regex": "\\d{1}"}}}, {"$project": {"status": 1}},  {"$limit": 2},{"$skip": 1}])
pymongo-aggregate
response = db.get_database("jenkins").get_collection('job').aggregate([{"$match" : {"projectBranch": {"$regex": "\\d{1}"}}}, {"$project": {"status": 1}},  {"$limit": 2},{"$skip": 1}])
print(list(response))

mongo+pandas

import pandas as pd
import pymongo


host = "xxx"
port = 30019
db = pymongo.MongoClient(host=host, port=port)

data = pd.DataFrame(db.get_database("jenkins").get_collection('test').find())

db.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值