美文网首页
mongodb简单实用

mongodb简单实用

作者: 加勒比兔Z | 来源:发表于2020-01-26 19:14 被阅读0次

    客户端
    https://robomongo.org/


    连接
    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
    mongodb:// 这是固定的格式,必须要指定。
    username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
    host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
    portX 可选的指定端口,如果不填,默认为27017
    /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
    ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开


    创建数据库
    use DATABASE_NAME
    如果有则切换到数据库,没有则创建,数据库需要插入数据才能够显示。
    示例:
    > use test
    switched to db runoob
    > db
    test

    插入数据
    数据库需要有数据才能够显示
    db.collectionName.insert({"name":"close"})
    删除数据库
    >use db
    >db.dropDatabase()
    查看所有数据库
    show dbs


    创建集合
    [语法格式]
    db.createCollection(name, options)
    建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个
    db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

    options固定格式
    字段  类型  描述
    capped  布尔  (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true
    时,必须指定 size 参数。
    autoIndexId 布尔  (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
    size    数值  (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
    max 数值  (可选)指定固定集合中包含文档的最大数量。
    

    删除集合
    db.collection.drop()
    [ 注释:db.[collectionName].drop()]


    插入
    MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
    db.COLLECTION_NAME.insert(document)
    插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

    >db.col.insert({title: 'MongoDB 教程', 
        description: 'MongoDB 是一个 Nosql 数据库',
        by: '菜鸟教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    })
    

    3.2版本以后新增插入命令
    db.collection.insertOne():向指定集合中插入一条文档数据
    [var res = db.collection.insertMany([{"b": 3}])]
    db.collection.insertMany():向指定集合中插入多条文档数据
    [var res = db.collection.insertMany([{"b": 3}, {'c': 4}])]

    还可以定义数组一次性插入

    var arr = [];
    for(var i=1 ; i<=20000 ; i++){
        arr.push({num:i});
    }
    db.numbers.insert(arr);
    

    更新
    db.collection.update(
    <query>,
    <update>,
    {
    name: <value>,
    }
    )

    参数说明:
    
    query : update的查询条件,类似sql update查询内where后面的。
    update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    writeConcern :可选,抛出异常的级别。
    

    示例
    只更新第一条记录:
    db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
    全部更新:
    db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
    只添加第一条:
    db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
    全部添加进去:
    db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
    全部更新:
    db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
    只更新第一条记录:
    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );


    删除文档
    remove() 方法的基本语法格式如下所示:(方法已过时,因为remove() 方法 并不会真正释放空间。需要继续执行 db.repairDatabase()或者db.runCommand({ repairDatabase: 1 }) 来回收磁盘空间。)
    db.collection.remove(
    <query>,
    <justOne>,
    writeConcern: <document>
    )

    参数说明:
    query :(可选)删除的文档的条件。
    justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,
    则删除所有匹配条件的文档。
    writeConcern :(可选)抛出异常的级别。
    

    新版方法
    deleteOne(),deleteMany

    示例
    删除 status 等于 A 的全部文档:
    db.inventory.deleteMany({ status : "A" })
    删除 status 等于 D 的一个文档:
    db.inventory.deleteOne( { status: "D" } )


    查询
    [语法]
    MongoDB 查询数据的语法格式如下:
    db.collection.find(query, projection)

    query :可选,使用查询操作符指定查询条件
    projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
    如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
    >db.col.find().pretty()
    

    MongoDB 与 RDBMS Where 语句比较
    如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

    操作 格式 范例 RDBMS中的类似语句
    等于 (=) {<key>:<value>} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
    小于 (<) {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
    小于或等于 (<=) {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
    大于 (>) {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
    大于或等于 (>=) {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
    不等于(!=) {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

    MongoDB AND 条件
    >db.col.find({key1:value1, key2:value2}).pretty()
    MongoDB OR 条件
    >db.col.find(
    {
    $or: [
    {key1: value1}, {key2:value2}
    ]
    }
    ).pretty()
    [>db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()]
    AND 和 OR 联合使用
    以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为:
    where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')
    >db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()

    模糊查询
    查询 title 包含"教"字的文档:
    db.col.find({title:/教/})
    查询 title 字段以"教"字开头的文档:
    db.col.find({title:/^教/})
    查询 titl e字段以"教"字结尾的文档:
    db.col.find({title:/教$/})

    Limit与Skip方法
    db.COLLECTION_NAME.find().limit(NUMBER)
    Skip() 方法 skip()方法默认参数为 0 。
    我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
    >db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
    以下实例只会显示第二条文档数据
    db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
    排序 sort() 方法
    在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
    db.COLLECTION_NAME.find().sort({KEY:1})
    skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。


    操作符
    如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
    db.col.find({"title" : {$type : 2}})

    db.col.find({"title" : {$type : 'string'}})

    类型 数字 备注
    Double 1
    String 2
    Object 3
    Array 4
    Binary data 5
    Undefined 6 已废弃。
    Object id 7
    Boolean 8
    Date 9
    Null 10
    Regular Expression 11
    JavaScript 13
    Symbol 14
    JavaScript (with scope) 15
    32-bit integer 16
    Timestamp 17
    64-bit integer 18
    Min key 255 Query with -1.
    Max key 127

    MongoDB 索引
    createIndex() 方法
    语法
    >db.collection.createIndex(keys, options)
    语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
    例如:db.col.createIndex({"title":1})
    createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
    >db.col.createIndex({"title":1,"description":-1})
    在后台创建索引:
    db.values.createIndex({open: 1, close: 1}, {background: true})

    1、查看集合索引
    db.col.getIndexes()
    2、查看集合索引大小
    db.col.totalIndexSize()
    3、删除集合所有索引
    db.col.dropIndexes()
    4、删除集合指定索引
    db.col.dropIndex("索引名称")

    利用 TTL 集合对存储的数据进行失效时间设置:经过指定的时间段后或在指定的时间点过期,MongoDB 独立线程去清除数据。类似于设置定时自动删除任务,可以清除历史记录或日志等前提条件,设置 Index 的关键字段为日期类型 new Date()。

    例如数据记录中 createDate 为日期类型时:
    设置时间180秒后自动清除。
    设置在创建记录后,180 秒左右删除。
    db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})

    2、由记录中设定日期点清除。
    设置 A 记录在 2019 年 1 月 22 日晚上 11 点左右删除,A 记录中需添加 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 IndexexpireAfterSeconds 设值为 0。
    db.col.createIndex({"ClearUpDate": 1},{expireAfterSeconds: 0})

    其他注意事项:

    • 索引关键字段必须是 Date 类型。
    • 非立即执行:扫描 Document 过期数据并删除是独立线程执行,默认 60s 扫描一次,删除也不一定是立即删除成功。
    • 单字段索引,混合索引不支持。

    createIndex() 接收可选参数,可选参数列表如下:

    Parameter Type Description
    background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。
    unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
    name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
    dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
    sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
    expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
    v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
    weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
    default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
    language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

    MongoDB 聚合
    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。(其实就是count(),max(),sum()用法)
    aggregate() 方法
    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
    例如:
    数据结构

    {
       _id: ObjectId(7df78ad8902c)
       title: 'MongoDB Overview', 
       description: 'MongoDB is no sql database',
       by_user: 'runoob.com',
       url: 'http://www.runoob.com',
       tags: ['mongodb', 'database', 'NoSQL'],
       likes: 100
    },
    

    现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
    select by_user, count(*) from mycol group by by_user
    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

    表达式 描述 实例
    $sum 计算总和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
    $avg 计算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
    $min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
    $max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
    $push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
    $addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
    $first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
    $last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

    管道
    管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
    MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
    表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档

    常见管道操作
    $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
    $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
    $limit:用来限制MongoDB聚合管道返回的文档数。
    $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
    $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
    $group:将集合中的文档分组,可用于统计结果。
    $sort:将输入文档排序后输出。
    $geoNear:输出接近某一地理位置的有序文档。
    

    示例:(其实没看懂这里到底怎么写)

     db.col.aggregate([
    {
        $group:{
            _id:"$age",count:{$sum:1}
            }
    },
    {
        $sort:{
            age:-1
        }
    }
    ])
    

    备份恢复
    备份
    命令:mongodump -h dbhost -d dbname -o dbdirectory

    -h:
    MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
    -d:
    需要备份的数据库实例,例如:test
    -o:
    备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump
    目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
    

    恢复
    mongorestore -h <hostname><:port> -d dbname <path>

    --host <:port>, -h <:port>:
    MongoDB所在服务器地址,默认为: localhost:27017
    --db , -d :
    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
    --drop:
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
    <path>:
    mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
    你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
    --dir:
    指定备份的目录
    你不能同时指定 <path> 和 --dir 选项。
    

    mongodb监控
    mongostat 命令
    mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。
    启动你的Mongod服务,进入到你安装的MongoDB目录下的bin目录, 然后输入mongostat命令,如下所示:
    D:\set up\mongodb\bin>mongostat

    image.png
    mongotop 命令
    mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。
    启动你的Mongod服务,进入到你安装的MongoDB目录下的bin目录, 然后输入mongotop命令,如下所示:
    D:\set up\mongodb\bin>mongotop
    E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
    image.png
    报告每个数据库的锁的使用中,使用mongotop - 锁,这将产生以下输出:
    E:\mongodb-win32-x86_64-2.2.1\bin>mongotop --locks
    image.png
    输出结果字段说明:
    ns:
    包含数据库命名空间,后者结合了数据库名称和集合。
    db:
    包含数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
    total:
    mongod花费的时间工作在这个命名空间提供总额。
    read:
    提供了大量的时间,这mongod花费在执行读操作,在此命名空间。
    write:
    提供这个命名空间进行写操作,这mongod花了大量的时间。
    

    相关文章

      网友评论

          本文标题:mongodb简单实用

          本文链接:https://www.haomeiwen.com/subject/btgjthtx.html