zoukankan      html  css  js  c++  java
  • MongoDB基础操作

    1.mongodb安装后了解

    mongo.exe是客户端

    mongod.exe是服务器
    配置环境变量
    默认 监听端口port=27017 3306是mysql,6379是redis的

    2.启动配置

    启动命令:mongod
    直接在cmd输入mongod.exe启动服务器,报错。原因是没有配置好放数据的文件夹
    解决方法:在G:mongodb新建一data文件夹,再在data文件夹里新建一db文件夹---》然后在cmd输入mongod --dbpath="G:/mongodb/data/db/"指定数据存储目录(默认是c盘)。
    遇到阻塞状态即成功启动服务器 

    3.mongodb介绍

    Nosql数据库-----》非关系型数据库 mongodb是基于文件操作(redis是基于内存操作的)
    mysql和mongodb对比: 

    #mysql:
    id name age gender height
    1    yq    25   1      null
    2    ys     22   null    187
    #mongodb:
    {
        id:1,
        name:yq,
        age:25,
        gender:1    
    },
    {
        id:2,
        name:ys,
        age:22,
        height:187
    }

    总结:Mongodb存储的是JSON数据

    4.mongodb基本命令

    在cmd输入mongo,打开客户端
    指令:

    1.show databases 查看本地数据库 -----》在本地磁盘中的
    2.use databasename 切换当前使用的数据库
    3.db 查看当前使用的数据库
    4.show tables 查看当前数据库中的表 ------》在本地磁盘中的表

    新建数据库:

    use 不存在的数据库名 即创建该数据库 -----》在内存中创建
    db.不存在的表名 即在数据库中创建该表 -----》也在内存中

    **创建好后新数据库后,使用db可以查看当前的数据库,但使用show databases显示没有;同样新建的表用show tables查看也没有

    原因:没有增删改查的数据写入。只要有一条就可以查看。

    使用不存在的对象即创建该对象----》在内存里

    5.mongodb的数据类型

    ObjectId : 每条数据都会自动生成的id----------------》和库表无关 会自增
    String : 字符串,必须是utf-8
    Boolean :布尔值 true/false
    Integer : 整数 (一般用Int32)
    Double :浮点型 (没有float型)
    Arrays :数组或列表
    Object :字典
    Null : 空数据类型
    Timestamp:时间戳
    Date :存储当前日期(不用,用时间戳)

    nosqlbooster4mongo -----》mongodb可视化工具

    6.增删改查

    (1).增:insert

    db.tablename.insert({},{})  #
    #官方推荐写法:
    db.tablename.insertOne({})   #插入一条
    db.tablename.insertMany([{},{}])  #插入多条

    (2).查 find

    db.tablename.find({查询条件}) 查 -----》查询所有符合条件的数据
    db.tablename.findOne({}) 查询符合条件的第一条数据
    例子:    
    db.tablename.find({查询条件}) 查询所有符合条件的数据
    db.tablename.find({name:'ys'}) 条件查询
    db.tablename.findOne({name:'ys'}) 只查询一条符合条件的
    db.tablename.find({name:'ys',age:25}) /*并列条件查询*/

    $数据比较符 ------>仅用于数字型

    $gt  >  db.tablename.find(age:{$gt:20})    #查询年龄大于20的记录
    $gte >=  db.tablename.find(age:{$gte:20})   #大于等于
    $lt  <  db.tablename.find(age:{$lt:20})  #小于
    $lte <=   db.tablename.find(age:{$lte:20})  #小于等于
    $eq  =
    $ne  !=

    (3).改 update

    a.db.tablename.update({},{})  #改 --》修改符合条件的第一条数据
    #官方推荐:
    db.tablename.updateOne({},{}) # 修改符合条件的第一条数据
    db.tablename.updateMany({},{}) # 修改符合条件的所有数据

    b.修改器

    所有mongodb的修改(update)全部基于修改器
    修改器形式:

    $修改器 关键字

    常用修改器:

    $set
    强制将某字段值修改,如果该字段不存在,则创建该字段并赋值。

    db.tablename.update({age:24},{$set:{age:44}})
    db.tablename.update({name:'ys'},{$set:{age:44}})  #ys的age变为44    

    $unset

    删除字段

    db.tablename.update({name:'ys'},{$unset:{age:1}}) # 后面那个必须写1

    $inc

    引用增加 -----》先引用原有数据,再在原有数据基础上增加(可是负数 -10)

    db.tablename.update({name:'ys'},{$inc:{age:10}})  #给ys的age加10    

    不常用:

    针对Array List操作

    $push==append
    #在Array类型中增加数据,在最末端---》一条数据
    db.tablename.update({name:'ys'},{$push:{hobby:7}}) #hobby是个列表
    $pushAll==extends
    #在Array类型中增加数据,在最末端---》多条数据----》必须是列表类型
    db.tablename.update({name:'ys'},{$pushAll:{hobby:[6,8,9,11]}})
    $pull==remove()
    #删除所有符合条件的数据
    db.tablename.update({name:'ys'},{$pull:{hobby:7}}) 
    $pullAll
    #遍历删除符合条件的数据
    db.tablename.update({name:'ys'},{$pullAll:{hobby:[6,8,9,11]}})
    $pop~pop()
    #只能删除Array中的第一条和最后一条数据。第一条数据:-1;最后一条:1
    db.tablename.update({name:'ys'},{$pop:{hobby:-1}}) #删除第一个数据
    db.tablename.update({name:'ys'},{$pop:{hobby:1}}) #删除最后一条数据 pop的正为最后

    c.$关键字

    $是用来存储符合当前Array条件元素的下标索引

    db.tablename.update({name:'ys',hobby:4},{$set:{"hobby.$":5}}) #将hobby列表Array中的4改为5

    当前Array---[1,2,3,4,5,6,7,8]

    条件元素----hobby:4
    当前Array的第4个元素符合条件,它的下标索引是3,当前的$就是3.通过“.索引”方式取值时,一定要用双引号包裹。如"字段.索引位置"
    (4).删 remove

    db.tablename.remove({查询条件})  #删 如果查询条件为空,则删除所有数据 危险!
    #官方推荐:    
    db.tablename.removeOne({})  # 删除符合条件的第一条数据
    db.tablename.removeMany({})   # 删除所有符合条件的数据

    7.选取 跳过 排序

    (1).排序

    db.tablename.find({}).sort({age:1}) # age是字段,是个列表,里面有字典,键为age,值为1,2,3,4等数字。 1代表递增(从小到大)-1代表降序

    (2).跳过

    db.tablename.find({}).skip(2)   #跳过两条 前面两条

    (3).选取

    db.tablename.find({}).limit(5)  #选5条 0、1、2、3、4------》如果数据条目大于全部数据,就全部查询

    (4).例子 

    db.tablename.find({}).skip(2).limit(4)  #跳过两条选4条 

    sort和skip、limit三者顺序不管怎么组合,都是先排序,再跳过,最后选取。

    (5)应用:分页(每页两条数据)

    page sort skip limit
    1     1    0     2
    2     1    2     2
    3     1    4     2
    4     1    6     2
    
    count = 2
    page = 1
    skip((page-1)*count) #跳过的页数
    db.user.find({}).sort({age:-1}).skip((page-1)*count).limit(count)

    8.python操作mongodb

    pymongo

    from pymongo import MongoClient
    MC=MongoClient('127.0.0.1',27017) #创建连接 即创建mongodb客户端
    db=MC['db10'] #选择或者创建数据库(在内存) -----》use
    player_info={
    'nickname':'yq',
    'age':10,
    'year':1998,
    'height':178,
    'hobby':[{
    'name':'basketball',
    'when':14,
    },
    {
    'name':'book',
    'when':23
    }
    ]
    }
    # 增加数据
    db.player.insert_one(player_info)

    查询数据:

    (1).find({})

    res=db.player.find({})
    print(res) 
    #<pymongo.cursor.Cursor object at 000002363EA630F0> 可遍历
    print(res.inserted_id,type(res.inserted_id)) #当前新增数据的id
    for i in res:
        print(i)

    (2).find_one({})

    res=db.player.find_one({}) #查询符合条件的第一条是数据
    res=db.player.find_one({'nickname':'ys','height':{'$gt':167}})
    print(res)

    (3)更新数据 update

    res=db.player.update_one({'nickname':'yq'},{'$set':{'year':1978}})
    print(res)
    res=db.player.update_many({},{'$inc':{'height':10}}) #给身高都增加10

    (4)删除数据

    res=db.player.delete_one({"_id":'5e546fa5c3147e1517073b03'}) #这样删不掉---》这个id不是字符串
    from bson.objectid import ObjectId
    res=db.player.delete_one({"_id":ObjectId('5e546fa5c3147e1517073b03')})
    print(res.deleted_count) #0代表没有删除

    (5)ObjectId不能被JSON序列化,要先转化 ----》pickle不确定

    res=db.player.find_one({'nickname':'ys','height':{'$gt':167}})
    #转换id
    res['_id']=str(res.get('_id')) #转化为字符串
    res_json=json.dumps(res)
    print(res_json) #Object of type 'ObjectId' is not JSON serializable. 要将id转换下    

    #排序 跳过 选取

    from pymongo import ASCENDING,DESCENDING
    res=db.player.find({}).limit(2).skip(1).sort('age',ASCENDING)
    for i in res:
        print(i)

    9.flask和Mongodb

    flask接收到数据,数据是字典形式的,直接将字典存到MongoDb数据库中。
    app应用中:
    from flask import Flask, request, render_template, jsonify
    from setting import MongoDb
    app=Flask(__name__)
    
    @app.route('/reg',methods=['POST','GET'])
    def reg():
        if request.method=='GET':
            return render_template('reg.html')
        else:
            user_info=request.form.to_dict()
            res=MongoDb.user.insert_one(user_info)   #直接把字典存在数据库user表中(没有user表就新建)
            if res.inserted_id:
                return '注册成功'
            else:
                return '注册失败'
    
    @app.route('/login',methods=['POST','GET'])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
        else:
            user_info=request.form.to_dict()
            user_info_dict=MongoDb.user.find_one(user_info)
            user_info_dict['_id']=str(user_info_dict['_id'])  #先把bson的id转化下成字符串
            return jsonify(user_info_dict)
    
    if __name__ == '__main__':
        app.run()

    在settings.py文件中,使用数据库

    from pymongo import MongoClient
    MC=MongoClient('127.0.0.1',27017)
    MongoDb=MC['db11']    

    10.$or $and $all $in

    #并列条件 $and
    "$and":[{},{},{}]
    res=list(MongoDB.user.find({"name":"ys","age":15}))
    print(res[0])
    res=list(MongoDB.user.find("$and":[{"name":"ys"},{"age":15}]))     #list()表示把查询出来的结果放在列表中,好取
    #或条件 $or
    res=MongoDB.user.find("$or":[{"name":"ys"},{"age":15}])
    $all $in针对Array操作
    $in:包含
    res=MongoDB.user.find("name":{"$in":[111,222,333]})       #name中有111或者222或者333的都被查出来
    $all----->自己查询---》后面条件是前面的子集

    Mongodb小概念

    Mysql : DataBase ---->Tables ---->Column Row
    MongoDB DataBase Collections Field Documents

    危险操作

    MongoDB.user.drop() #删除表---》没有确认,直接删除
    MongoDB.dropDatabase() #删除数据库,也没有确认,直接删除           一般删除前要先复制





    
    
  • 相关阅读:
    Hibernate动态更新
    Spring MVC实现文件上传
    windows 常用命名
    有用的SQL查询
    SQL语句、EF DataAnnotation和EF Fluent API方式创建联合主键
    EF6学习笔记三十二:性能优化——实体缓存和翻译缓存
    EF6学习笔记三十一:性能优化(二)
    EF6学习笔记三十:性能优化——预编译视图
    EF6学习笔记二十九:并发冲突(三)
    EF6学习笔记二十八:并发冲突(二)
  • 原文地址:https://www.cnblogs.com/yq055783/p/12361365.html
Copyright © 2011-2022 走看看