Task 02: MongoDB数据库part

友好的学习链接

MongoDB数据库的使用

推荐 菜鸟教程 + 大神笔记 + bili资源1 + bili资源2

1- MongoDB数据库的特点
  • 由C++语言编写,基于分布式文件存储的开源数据库系统,旨在为WEB应用提供可扩展的高性能数据存储解决方案;

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

{
     name: "sue",
     age: 26,
     status: "A",
     groups: ['news', 'sports']
    }
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
2- MySQL和MongoDB区别
SQL术语 MongoDB数据库术语 解释
database database 数据库
table collection 表格/集合
row document 数据行/文档
column field 数据列/域
index index 索引
primary key primary key 主键/MongoDB中主键是默认的,创建集合时自动创建主键(_id)
表连接 无表连接 MongoDB中无表连接
3- mongodb的一些简单终端操作
  • 查看当前mongodb数据库的版本号

    db.version()  # 5.0.5
    
  • 查看当前所在的数据库,默认是test数据库

    db  # test
    
  • 查看当前数据库的链接地址

    db.getMongo()    # connection to 127.0.0.1:27017  (本地)
    
  • 查看所有数据库

    show databases  /  show dbs  # 如果数据库中没有数据,则该数据库不会显示
    # admin   0.000GB
    # config  0.000GB
    # local   0.000GB
    
  • 切换数据库,如果数据库不存在,会先创建再切入(即数据库的隐式创建)

    use class   # switched to db class
    
  • 创建集合

    db.createCollection('集合名称')
    
  • 查看集合

    show tables  /  show collections
    
  • 插入文档

    db.集合名称.insert({键值对数据})  /  db.集合名称.save({键值对数据})
    > db.students.insert({'name': 'Mark', 'age': 20, 'height': 180})
    WriteResult({ "nInserted" : 1 })
    > db.studens.save({'name': "Jack", "age": 23, "height": 178})
    WriteResult({ "nInserted" : 1 })
    # 注意:如果想要插入多条数据,可以将多个对象放到一个数组中。
    > db.students.insert([{'name': 'Hellen', 'age': 18, 'height': 168}, {'name': "John", "age": 22, "height": 180}])
    BulkWriteResult({
            "writeErrors" : [ ],
            "writeConcernErrors" : [ ],
            "nInserted" : 2,
            "nUpserted" : 0,
            "nMatched" : 0,
            "nModified" : 0,
            "nRemoved" : 0,
            "upserted" : [ ]
    })
    # 注意:如果集合名不存在,会先创建再插入,即集合的隐式创建。
    
  • 查询数据

    db.集合名.find()
    
  • 查询当前数据库的状态

    db.stats()
    {
            "db" : "class",
            "collections" : 2,
            "views" : 0,
            "objects" : 4,
            "avgObjSize" : 66.5,
            "dataSize" : 266,
            "storageSize" : 57344,
            "freeStorageSize" : 16384,
            "indexes" : 2,
            "indexSize" : 57344,
            "indexFreeStorageSize" : 16384,
            "totalSize" : 114688,
            "totalFreeStorageSize" : 32768,
            "scaleFactor" : 1,
            "fsUsedSize" : 116896038912,
            "fsTotalSize" : 196495798272,
            "ok" : 1
    }
    
  • 删除集合

    db.集合名.drop()
    
  • 删除当前所在的数据库

    db.dropDatabase()
    
  • 修改/更新数据

db.集合名.update(query, update[, upsert, multi])
# query:必要参数,条件(小于:$lt,大于:$gt,等于:$eq,不等于:$ne,大于等于:$gte,小于等于:$lte)
# update:必要参数,更新的数据。 $set:设置值,$inc:增长值,$rename:重命名,$unset:删除
# upsert:可选参数,布尔值,表示如果不存在update数据,是否插入更新的数据。默认false,表示不插入,true表示插入
# multi:可选参数,布尔值,表示是否将查询结果中数据进行全部更新。默认false,表示更新第一条,true表示全部更新
  • 删除文档

    db.集合名.remove(query[, justOne])
    db.集合名.remove({})   # 删除全部文档
    # justOne:可选参数,布尔值,默认false,表示符合条件的全部删除,true表示只删除符合条件的一条数据。
    
  • 查询文档

    db.集合名.find()  # 表示查询所有文档
    db.集合名.find(query)   # 表示查询所有符合条件的文档
    db.集合名.find(query, projection)  # 表示显示查询符合条件的某些键值
    > db.students.find()
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b23"), "name" : "Hellen", "age" : 18, "height" : 168 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b24"), "name" : "John", "age" : 22, "height" : 180 }
    > db.students.find().pretty()  # 格式化输出
    {
            "_id" : ObjectId("61bd8d3686bc7040ca640b21"),
            "name" : "Mark",
            "age" : 20,
            "height" : 180
    }
    {
            "_id" : ObjectId("61bd8e0f86bc7040ca640b23"),
            "name" : "Hellen",
            "age" : 18,
            "height" : 168
    }
    {
            "_id" : ObjectId("61bd8e0f86bc7040ca640b24"),
            "name" : "John",
            "age" : 22,
            "height" : 180
    }
    > db.students.find({'name': 'Mark'}, {'age': 1})
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "age" : 20 }
    > db.students.find({'name': 'Mark'}, {'age': 0})  # 0不显示,1显示
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "height" : 180 }
    db.集合名.findOne([query, preojection])  #只查询一条数据,返回的是格式化数据,不能和pretty()方法联合使用了,会报错
    
  • 多条件查询

    • and
    sql: select * from 表 where xxx and xxx
    mongodb: db.集合名.find({k1: v1, k2: v2, ...})
    > db.students.find({'name': 'Mark', 'age': 20})
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    
    • or
    sql: select * from 表 where xxx or xxx
    mongodb: db.集合名.find({'$or': [{k1: v1}, {k2: v2}, ...]})
    > db.students.find({'$or': [{'age': {'$lte': 22}},{ 'height': 168}]})
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b23"), "name" : "Hellen", "age" : 18, "height" : 168 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b24"), "name" : "John", "age" : 22, "height" : 180 }
    
  • 查询某一列去重后的数据

    sql: select distinct 字段 from 表
    mongodb: db.集合名.distinct(key)
    > db.students.distinct('height')
    [ 168, 180 ]
    
  • 限制查询

    sql: select * from 表 limit 2
    mongodb: db.集合名.find().limit(n)   # n代表数字,代表查询前n条数据
    > db.students.find().limit(2)
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b23"), "name" : "Hellen", "age" : 18, "height" : 168 }
    
  • 跳过操作

    sql: select * from 表 limit 2, 3
    mongodb: db.集合名.find().skip(n)  # n表示跳过前n条,从第n+1条开始查询
    
  • 分页操作

    sql: select * from 表 limit 2, 3
    mongodb: db.集合名.find().skip(n).limit(m)  # n表示跳过前n条,从第n+1条开始查询m条记录
    
  • 排序

    sql: select * from 表 order by 字段 asc/desc
    mongodb: db.集合名.find().sort({'k': 1(正序)/-1(倒序)})
    > db.students.find().sort({'age': 1})
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b23"), "name" : "Hellen", "age" : 18, "height" : 168 }
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    { "_id" : ObjectId("61bd8e0f86bc7040ca640b24"), "name" : "John", "age" : 22, "height" : 180 }
    
  • 统计方法

    sql: select count(*) from 表
    mongodb: db.集合名.find().count()
    > db.students.find().count()
    3
    
  • 模糊查询

    sql: select * from 表 where 字段 like %xxx%
    mongodb: db.集合名.find({'k': '/xxx/'})
    > db.students.find({'name': /a/})
    { "_id" : ObjectId("61bd8d3686bc7040ca640b21"), "name" : "Mark", "age" : 20, "height" : 180 }
    
4- PyMongo使用
  • 创建数据库

    import pymongo
    myclient = pymongo.MongoClient('mongodb://localhost:27017/')
    # myclient = pymongo.MongoClient(host='127.0.0.1', port=27017)
    mydb = myclient['test_ex']
    
  • 判断数据库是否存在

    dblist = myclient.list_datebase_names()
    if 'test_ex' in dblist:
        print("数据库已存在!")
    else:
        print("数据库不存在。")
    
  • 创建集合

    mycol = myclient['test_ex']['grade']  # 方括号的方式选择数据库和集合
    
  • 判断集合是否存在

    collist = mydb.list_collection_names()
    if 'grade' in collist:
        print("集合已存在!")
    else:
        print("集合不存在。")
    
5- 实操示例
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')  # 实例化client,建立连接

test1218_db = myclient['test_1218']
test1218_db_students = myclient['test_1218']['students']

# 插入一条数据
ret = test1218_db_students.insert({'name': "test_Mark", "age": 20})
print(ret)
test1218_db_students.insert({'name': "test_Mark", "age": 18})
test1218_db_students.insert({'name': "test_Mark", "age": 33})
# 插入多条数据
data_list = [{"name": "test_Harry{}".format(i)} for i in range(10)]
ret_many = test1218_db_students.insert_many(data_list)
for i in ret_many.inserted_ids:
    print(i)
 
# 删除一个文档
n1 = test1218_db_students.delete_one({'name': "test_Mark"})
# 删除所有满足条件的文档
n_over2 = test1218_db_students.delete_many({'name': "test_Mark"})

# 更新一个文档
p1 = test1218_db_students.update_one({'name': "test_Mark"}, {"$set": {"name": "new_test_Mark"}})
# 更新全部符合条件文档
p_over2 = test1218_db_students.update_many({'name': "test_Mark"}, {"$set": {"name": "new_test_Mark"}})

# 查找一个文档
k1 = test1218_db_students.find_one({"name": "test_Mark"})
# 查找num个满足条件的文档
k1_num = test1218_db_students.find({"name": "test_Mark"}).limit(num)
# 查找所有满足条件的文档,如条件为空,则返回数据库的所有
k_over2 = test1218_db_students.find({"name": "test_Harry6"})
# k_over2是一个Cursor游标对象,可迭代,类似读取文件的指针
for i in k_over2:
    print(i)
for j in k_over2:
    print(j)   # 此时j中无内容
# 查找所有满足条件的文档,并排序, 1表示升序,-1表示降序
k_over2_sorted = test1218_db_students.find({"name": "test_Harry6"}).sort('age', -1)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容