当前位置 博文首页 > weixin_41997073的博客:【星海出品】Mongodb快速入门

    weixin_41997073的博客:【星海出品】Mongodb快速入门

    作者:[db:作者] 时间:2021-07-15 15:38

    MongoDB
    是一个基于分布式文件存储的非关系型数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    文档是MongoDB的核心概念。文档就是键值对的一个有序集{‘msg’:‘hello’,‘foo’:3}。类似于python中的有序字典

    架构简单 没有复杂的连接
    深度查询能力,MongoDB支持动态查询。
    容易调试 容易扩展
    不需要转化/映射应用对象到数据库对象
    使用内部内存作为存储工作区,以便更快的存取数据。

    安装
    https://www.mongodb.com/download-center/community
    windows下载官方zip,解压即可使用。

    组件文件名称
    servermongod.exe
    routermongos.exe
    clientmongo.exe
    MonitoringToolsmongostat.exe,mongotop.exe
    ImportExportToolsmongodump.exe, mongorestore.exe, mongoexport.exe, mongoimport.exe
    MiscellaneousToolsbsondump.exe, mongo?les.exe, mongooplog.exe, mongoperf.exe

    运行
    $ cd /o/mongodb3.6/bin
    $./mongod.exe

    MongoDB服务端可运行在Linux、Windows或mac os
    x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

    MongoDB是一个有趣设计的数据库。适于存储JSON等类文档数据。还提供了分片功能 在全栈 Javascript 开发架构,使用
    MongoDB,Express,React,Node。具有 React
    组件的热加载、模块化文件结构等特性。简称为MERN。其中M就是指的MongoDB
    MERN开发建构 https://www.oschina.net/p/mern

    mongodb配置使用YAML格式

    嵌套使用缩进完成,不支持Tab等制表符,支持空格 冒号后要有空格
    Yaml参考https://www.w3cschool.cn/iqmrhf/dotvpozt.html
    配置http://mongoing.com/docs/reference/con?guration-options.html

    systemLog
    	destination, 		#缺省是输出日志到std,?le表示输出到文件
    	path, 				#日志路径
    	logAppend,true  	#表示在已存在的日志文件追加。默认false,每次启动服务,重新创建新的日志。
    storage
    	dbPath,      		#必须指定,mongodb的数据目录
    net
    	bindIp,			#缺省绑定到127.0.0.1
    	port,				#端口,缺省为27017,客户端连接用
    

    windows下 mongodb需要激活,命令如下
    $ mongod.exe -f “o:/mongodb3.6/bin/mongod.yml” --serviceName mongod --serviceDisplayName mongo --install

    linux基础操作
    登入数据库

    [mongod@MongoDB ~]$ mongo
    MongoDB shell version: 3.2.8
    connecting to: test
    

    普通配置文件

    cd /application/mongodb/conf/
    [mongod@MongoDB conf]$ vim mongod1.conf 
    dbpath=/application/mongodb/data
    logpath=/application/mongodb/log/mongodb.log
    port=27017
    logappend=1
    fork=1
    

    使用配置文件开启和关闭

    启动:mongod -f mongod1.conf 
    关闭:mongod -f mongod1.conf  --shutdown
    

    在数据库中关闭的方法

    shell > mongo
    [mongod@MongoDB conf]$ mongo
    MongoDB shell version: 3.2.8
    connecting to: test
    > db.shutdownServer()
    shutdown command only works with the admin database; try 'use admin'
    > use admin
    > db.shutdownServer()
    server should be down...
    

    数据库中的基础操作可以查看
    https://www.cnblogs.com/clsn/p/8214194.html

    python开发对接

    Pycharm插件 在settings/plugins中输入mongo,安装Mongo Plugin,完成后重启Pycharm。
    菜单项View/Tool Windows/Mongo Explorer
    Mongodb官方推荐使用pymongo。参看https://docs.mongodb.com/ecosystem/drivers/pymongo/
    本次Mongodb使用的是3.6,需要pymongo 3.6以上。缺省安装pymongo 3.8,目前兼容Python 3.4+。
    mongodb的连接字符串 mongodb://wayne:wayne@127.0.0.1:27017/test

    from pymongo import MongoClient
    #client = MongoClient(host='127.0.0.1', port=27017) #客户端连接
    client = MongoClient('mongodb://127.0.0.1:27017')
    print(client)
    
    #db = client.blog
    db = client['blog']#指定数据库
    print(db)
    
    #users = db['users']
    users = db.users#集合
    print(users)
    # MongoDB中可以创建使用多个库,但有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
    

    admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
    local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
    con?g:当Mongo用于分片设置时,con?g数据库在内部使用,用于保存分片的相关信息。

    插入数据

    from pymongo.results import InsertOneResult
    user1 = {'id':'1','name':'ben','age':20}
    #单条插入
    x:InsertOneResult = users.insert_one(user1)
    print(type(x),x)
    print(x.inserted_id)  # 5d45546f42a331914ccaaf06
    
    user2 = {'id':257,'name':'tom','age':32}
    user3 = {'id':258,'name':'jerry','age':48}
    
    #批量插入
    result = users.insert_many([user2,user3])
    print(result.inserted_ids)
    # [ObjectId('5d4557be12f2bf1448c743de'),
    #  ObjectId('5d4557be12f2bf1448c743df')]
    
    #大小写敏感
    user4 = {'id':'3','name':'tom','age':20,'Name':'tommy'}
    x = users.insert_one(user4)
    print(x.inserted_id)
    
    import datetime
    t ='5d45546f42a331914ccaaf06'[:8]#时间戳提取
    print(t)
    x = int.from_bytes(bytes.fromhex(t),'big')
    print(hex(x),x)
    print(datetime.datetime.fromtimestamp(x))
    import bson
    print(bson.ObjectId('5d45546f42a331914ccaaf06').generation_time)
    
    # 每一条记录对应一个文档,其格式使用BSON。BSON即Binary JSON。
    每条数据插入后都有一个唯一key,属性 id 唯一标识一个文档。没有没有显式指明该属性,会自动生成一个ObjectId类型的 id 属性
    

    mongodb支持的操作符
    https://www.runoob.com/mongodb/mongodb-operators.html

    查询

    注: 使用db.collection.createIndex()在集合中创建一个索引,可以提高效率
    索引用于高效的执行查询,没有索引的MongoDB将扫描整个集合中的所有文档,这种扫描效率很低,需要处理大量
    的数据.
    索引是一种特殊的数据结构,将一小块数据集合保存为容易遍历的形式.索引能够存储某种特殊字段或字段集的
    值,并按照索引指定的方式将字段值进行排序.

    #查询
    result = users.find_one({'name':'tom'})
    print(type(result),result)#返回字典带oid
    
    #使用key查询
    from bson.objectid import ObjectId
    result = users.find_one({'_id':ObjectId('5d48d95d4fd47046028b8e54')})
    print(type(result),result)
    
    #查不到,返回None
    result = users.find_one({'name':'tommy'})
    print(type(result),result)#返回字典带oid
    

    查询操作
    可以使用任何常用查询操作符 $gt,$lt,$in等

    count = users.find({'age':{'$gt':20}}).count()
    print(count)
    

    排序

    results = users.find().sort('name',pymongo.DESCENDING)
    print(*list(results),sep='\n')
    print('-'*30)
    
    results = users.find().sort([
        ('name',pymongo.DESCENDING),
        ('age',pymongo.ASCENDING)
    ])
    print(*list(results),sep='\n')
    
    

    分页

    分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加 以及读写操作的要求。

    results =users.find()
    print(*list(results),sep='\n')
    print('-'*30)
    
    results = users.find().skip(2)
    print(*list(results),sep='\n')
    print('-'*30)
    
    results = users.find().skip(1).limit(2)
    print(*list(results),sep='\n')
    print('-'*30)
    
    

    更新

    #多行更新
    result = users.update_many({'name':'tom'}, {'$set':{'gender':'M'}})
    print(type(result), result)
    print(result.matched_count, result.modified_count)
    print(*list(users.find({'name':'tom'})), sep='\n') #全部更新
    
    #replaceOne更新一个文档
    #更新除_id字段外的所有字段
    result = users.replace_one({'name':'tom'},
                               {'id':200,'name':'sam'})
    print(type(result),result)
    print(*list(users.find()),sep='\n')
    

    删除

    #删除
    from pymongo.results import DeleteResult
    result:DeleteResult = users.delete_one({'Name':'tommy'})
    print(type(result),result.deleted_count)
    result = users.delete_many({'name':{'$exists':True}})
    print(type(result), result.deleted_count)
    print(*list(users.find()),sep='\n')
    print('-'*30)
    
    

    db.collection.delete_many({})删除所有文档,慎用

    cs