zoukankan      html  css  js  c++  java
  • Mongodb数据库基本操作

    启动mongodb的服务端和客户端

    启动服务端

    • sudo service mongod start 或者 sudo mongod

      • sudo mongod --config /etc/mongod.conf &(加&表示后台运行)

    启动客户端

    • mongo

    mongodb中数据库和集合的命令
    • 数据库不需要提前创建,插入数据时,自动创建

    • show dbs /show databases # 查看所有数据库

    • use 数据库名 # 使用数据库 (可以是一个当前不存在的数据库,当其中创建了集合,则该数据库才正式创建,否则退出后依然没有)

    • db.dropDatabase() # 删除数据库,不过要先进入该库-- use 要删除的库名

     

    • db # 查看当前所在的数据库

    • 集合不需要提前创建,插入数据时,自动创建

    • show collections # 查看所有的集合

    • db.集合名.drop() # 删除集合

    • db.集合名.find() # 集合的使用

    • db.集合名.insert({key1:value1,keys:value2,....}) # 集合插入数据

      

    > show dbs
    admin  (empty)
    local  0.078GB
    > use test0322
    switched to db test0322
    > show dbs
    admin  (empty)
    local  0.078GB
    > db.createCollection("test")
    > show dbs
    admin     (empty)
    local     0.078GB
    test0322  0.078GB
    > show collections
    system.indexes
    test
    > db.test.find()
    > db.test.insert({gender:"boy",_id:"1001"})
    WriteResult({ "nInserted" : 1 })
    > db.test.find()
    { "_id" : "1001", "gender" : "boy" }
    > db.test.insert({gender:"boy"})
    WriteResult({ "nInserted" : 1 })
    > db.test.find()
    { "_id" : "1001", "gender" : "boy" }
    { "_id" : ObjectId("5c94ebcd09befcda98f4448d"), "gender" : "boy" }

    删除数据库的命令: 先要切换到要删除的库 db.dropDatabase()

    删除集合的命令: db.集合名.drop()

    命令:db.集合名称.remove(<query>,{justOne: <boolean>})

    • db.集合名.remove({条件},{justOne:false}) # 默认删除全部,值为false,如果只删除一条,需要把值设为true或1.

    比较运算符

    插入测试数据

    db.test1.insert([
    {"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },
    {"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },
    {"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },
    {"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },
    {"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true },
    {"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true },
    {"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }
    ])
    • 等于: 默认是等于判断, 没有运算符

    • ⼩于:$lt (less than)

    • ⼩于等于:$lte (less than equal)

    • ⼤于:$gt (greater than)

    • ⼤于等于:$gte

    • 不等于:$ne

    db.test1.find({age:{$gt:18}})
    逻辑和范围运算符

    or:使⽤$or, 值为数组, 数组中每个元素为json

      查询年龄⼤于18, 或性别为false的学⽣
    db.test1.find({$or:[{age:{$gt:18},gender:false}]})

    查询年龄⼤于等于18或性别为男⽣, 并且姓名是郭靖
    db.test1.find({$or:[{age:{$gte:18},gender:true}],name:'gj'})

    使⽤$in$nin 判断数据是否在某个数组内

     查询年龄为18、 28的学⽣
    db.test1.find({age:{$in:[18,28]}})
    支持正则表达式

    使⽤//或$regex编写正则表达式

    插入测试数据

    db.regex.insert([
    { "_id" : 100, "sku" : "abc123", "description" : "Single line description" },
    { "_id" : 101, "sku" : "abc789", "description" : "First line
    Second line" },
    { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" },
    { "_id" : 103, "sku" : "xyz789", "description" : "Multiple
    line description" }
    ])

    查询sku以abc开头的数据
    db.regex.find({sku:/^abc/})

    查询sku以789结尾的数据
    db.regex.find({sku:{$regex:'789$'}})

    skip 和 limit
    • ⽅法limit(): ⽤于读取指定数量的⽂档

        db.集合名称.find().limit(NUMBER)
      查询2条学⽣信息
      db.test1.find().limit(2)
    • ⽅法skip(): ⽤于跳过指定数量的⽂档

        db.集合名称.find().skip(NUMBER)
       
    • 同时使用

        db.stu.find().limit(4).skip(5)

      db.stu.find().skip(5).limit(4)
      提示

      注意:先使用skip在使用limit的效率要高于前者

    投影&排序&统计&去重

    投影命令:db.集合名称.find({},{字段名称:1,...})

    db.test1.find({},{name:1,_id:0})

    排序命令:db.集合名称.find().sort({字段:1,...})

    db.test1.find().sort({age:1,gender:-1})

    统计命令:db.集合名称.find({条件}).count() or 命令:db.集合名称.count({条件})

    db.test1.count({age:{$gt:18},gender:true})

    去除重复命令:db.集合名称.distinct('去重字段',{条件})

    db.test1.distinct('hometown')

     

    聚合操作

    语法:db.集合名称.aggregate({管道:{表达式}})

    常用管道命令

    在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理 常用管道命令如下:

    • $group: 将集合中的⽂档分组, 可⽤于统计结果

    • $match: 过滤数据, 只输出符合条件的⽂档

    • $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果

    • $sort: 将输⼊⽂档排序后输出

    • $limit: 限制聚合管道返回的⽂档数

    • $skip: 跳过指定数量的⽂档, 并返回余下的⽂档

    常用表达式

    表达式:处理输⼊⽂档并输出 语法:表达式:'$列名' 常⽤表达式:

    • $sum: 计算总和, $sum:1 表示以⼀倍计数

    • $avg: 计算平均值

    • $min: 获取最⼩值

    • $max: 获取最⼤值

    • $push: 在结果⽂档中插⼊值到⼀个数组中

       

    # group
    db.test1.aggregate({$group:{_id:'$gender',counter:{$sum:1}}})
    { "_id" : false, "counter" : 18 }
    { "_id" : true, "counter" : 27.8 }
    
    
    # group by null
    db.test1.aggregate({$group:{_id:null,counter:{$sum:1}}})
    { "_id" : null, "counter" : 7 }
    
    
    # 数据透视
    db.test1.aggregate({$group:{_id:null,name:{$push:'$name'}}})
    { "_id" : null, "name" : [ "郭靖", "⻩蓉", "华筝", "⻩药师", "段誉", "段王爷", "洪七公" ] }
    #使用$$ROOT可以将整个文档放入数组中
    db.test1.aggregate({$group:{_id:null,name:{$push:'$$ROOT'}}})
    
    # 练习
    # 添加测试数据
    db.user.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "b" },{  "country" : "china", "province" : "sh", "userid" : "a" },{  "country" : "china", "province" : "sh", "userid" : "c" },{  "country" : "china", "province" : "bj", "userid" : "da" },{  "country" : "china", "province" : "bj", "userid" : "fa" }])
    
    # 需要统计出每个country/province下的userid的数量(同一个userid只统计一次)
    db.user.aggregate({$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}})
    # { "_id" : { "country" : "china", "province" : "sh" }, "count" : 3 }
    # { "_id" : { "country" : "china", "province" : "bj" }, "count" : 2 }
    
    # match  查询
    db.test1.aggregate({$match:{age:{$gt:18}}},{$group:{_id:'$gender',count:{$sum:1}}})
    # { "_id" : true, "count" : 3 }
    
    # project 用于修改文档的输入输出结构,比如重命名,增加,删除字段
    
    db.test1.aggregate({$project:{_id:0,name:1,age:1}})  # 投影
    
    db.user.aggregate({$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}},{$project:{_id:0,country:'$_id.country',province:'$_id.province',counter:'$count'}})
    '''
    { "country" : "china", "province" : "sh", "counter" : 3 }
    { "country" : "china", "province" : "bj", "counter" : 2 }
    '''
    
    # sort
     db.test1.aggregate({$group:{_id:'$gender',count:{$sum:1}}},{$sort:{count:1}})
    # { "_id" : false, "count" : 2 }
    # { "_id" : true, "count" : 5 }
    
    # skip & limit
     db.test1.aggregate(
         {$group:{_id:"$gender",counter:{$sum:1}}},
         {$sort:{counter:-1}},
         {$skip:1},
         {$limit:1}
     )
    # { "_id" : false, "counter" : 2 }
    mongodb创建简单的索引方法
    • 语法:

      • db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序

      • db.集合.createIndex({属性:1})

      • 上面两个命令效果等价

    • 具体操作:db.db_name.ensureIndex({name:1})

    索引的查看

    默认情况下_id是集合的索引

    查看方式:db.collection_name.getIndexes()

    创建唯一索引

    db.collection_name.ensureIndex({"name":1},{"unique":true})

    删除索引

    语法:db.t1.dropIndex({'索引名称':1})

    建立符合索引

    建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})

    mongodb的备份和恢复

    • 备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

    • -h: 服务器地址, 也可以指定端⼝号

    • -d: 需要备份的数据库名称

    • -o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据

    示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

    恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

    • -h: 服务器地址

    • -d: 需要恢复的数据库实例

    • --dir: 备份数据所在位置

    示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

     

    manogodb与python的交互

    pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo

    from pymongo import MongoClient
    
    # 创建数据库连接对象
    client = MongoClient(host='127.0.0.1',port=27017)
    # 选择具体的存储数据库和集合,client[db_name][collection]
    collection = client['test0322']['t1']
    
    # 插入一条数据
    # ret = collection.insert_one({'name':'jason','age':26})
    # print(ret)
    
    # 插入多条数据
    # item_list = [{'name':'py_{}'.format(i)} for i in range(10)]
    # t = collection.insert_many(item_list)
    
    # 查询一条数据
    # t = collection.find_one({'name':'py_0'})
    # print(t)
    
    # 查询全部数据
    t = collection.find({'name':'py_9'})
    #结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,
    # 可以使用强制类型转换成列表就可重复从列表中取值 t = list(t)
    for i in t:
        print(i)
    print('*'*100)
    
    for i in t: #此时t中没有内容
        print(i)
    
    
    #更新一条数据
    # collection.update({'name':'py_1'},{'$set':{'name':'py_2'}})
    
    # 更新全部数据
    # collection.update_many({'name':'py_2'},{'$set':{'name':'py_0'}})
    
    # 删除一条数据
    # collection.delete_one({'name':'py_0'})
    
    # 删除全部数据
    # collection.delete_many({'name':'py_0'})
    View Code
    <人追求理想之时,便是坠入孤独之际.> By 史泰龙
  • 相关阅读:
    Web安全学习计划
    机器学习资源大全
    推荐引擎的学习资料
    《Servlet与JSP核心编程》读书笔记
    Application "org.eclipse.ui.ide.workbench" could not be found in the registry.问题的解决
    Android 百度地图开发(二)
    Linux系统编程_1_文件夹读取(实现简单ls命令)
    Bootstrap 模态框、轮播 结合使用
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机
    Unique Binary Search Trees II
  • 原文地址:https://www.cnblogs.com/jason-Gan/p/10598521.html
Copyright © 2011-2022 走看看