zoukankan      html  css  js  c++  java
  • mongodb浅析

    设计特征:

    MongoDB 的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便。其主要功能特性如下。

    1)面向集合存储,容易存储对象类型的数据。在MongoDB 中数据被分组存储在集合中,集合类似RDBMS 中的表,一个集合中可以存储无限多的文档。

    2)模式自由,采用无模式结构存储。在MongoDB 中集合中存储的数据是无模式的文档,采用无模式存储数据是集合区别于RDBMS 中的表的一个重要特征。

    3)支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS 的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB 还提供创建基于地理空间的索引的能力。

    4)支持查询。MongoDB 支持丰富的查询操作,MongoDB 几乎支持SQL中的大部分查询。

    5)强大的聚合工具。MongoDB 除了提供丰富的查询功能外,还提供强大的聚合工具,如countgroup 等,支持使用MapReduce 完成复杂的聚合任务。

    6)支持复制和数据恢复。MongoDB 支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。而基于副本集的复制机制提供了自动故障恢复的功能,确保了集群数据不会丢失。

    7)使用高效的二进制数据存储,包括大型对象(如视频)。使用二进制格式存储,可以保存任何类型的数据对象。

    8)自动处理分片,以支持云计算层次的扩展。MongoDB 支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。

    9)支持PerlPHPJavaC#JavaScriptRubyC C++语言的驱动程序,MongoDB 提供了当前所有主流开发语言的数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB 数据库。

    10)文件存储格式为BSONJSON 的一种扩展)。BSON 是对二进制格式的JSON 的简称,BSON 支持文档和数组的嵌套。

    11)可以通过网络访问。可以通过网络远程访问MongoDB 数据库。

    Centos7下安装mongoDB3.4

    tar zxvf mongodb-linux-x86_64-rhel70-3.4.4.tgz

    mv mongodb-linux-x86_64-rhel70-3.4.4 mongodb344

    配置mongodb

    cd mongodb344/

    mkdir data

    mkdir logs

    vim /opt/mongodb344/mongodb.conf

    port=27017

    dbpath=/opt/mongodb344/data/

    rest=true

    logpath=/opt/mongodb344/logs/mongodb.log

    pidfilepath=/opt/mongodb344/mongo.pid

    fork=true

    logappend=true

    shardsvr=true

    #auth=true

    注释:

    --logpath 日志文件路径

    --master 指定为主机器

    --slave 指定为从机器

    --source 指定主机器的IP地址

    --pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。

    --logappend 日志文件末尾添加

    --port 启用端口号

    --fork 在后台运行

    --only 指定只复制哪一个数据库

    --slavedelay 指从复制检测的时间间隔

    --auth 是否需要验证权限登录(用户名和密码)

    5、启动:

    ./bin/mongod --config /opt/mongodb344/mongodb.conf

    6、设置开机自动启动mongodb 
    vi /etc/rc.d/rc.local 
    /opt/mongodb344/bin/mongod --config /opt/mongodb344/mongodb.conf

    MongoDBmysql 操作指令对比

    作用

    MySQL

    MongoDB

     

     

     

    服务器守护进程

    mysqld

    mongod

    客户端工具

    mysql

    mongo

    逻辑备份工具

    mysqldump

    mongodump

    逻辑还原工具

    mysql

    mongorestore

    数据导出工具

    mysqldump

    mongoexport

    数据导入工具

    source

    mongoimport

     

     

     

    新建用户并授权

    grant all on *.*
    to username@'localhost'
     identified by 'passwd';

    db.addUser("user","psw")
    db.auth("user","psw")

    显示库列表

    show databases;

    show dbs

    进去库

    use dbname;

    use dbname

    显示表列表

    show tables;

    show collections

    查询主从状态

    show slave status;

    rs.status

    创建库

    create database name;

    无需单独创建,直接use进去

    创建表

    create table tname(id int);

    无需单独创建,直接插入数据

    删除表

    drop table tname;

    db.tname.drop()

    删除库

    drop database dbname;

    首先进去该库,db.dropDatabase()

     

     

     

    插入记录

    insert into tname(id) value(2);

    db.tname.insert({id:2})

    删除记录

    delete from tname where id=2;

    db.tname.remove({id:2})

    修改/更新记录

    update tname set id=3
    where id=2;

    db.tname.update({id:2},
    {$set:{id:3}},false,true)

     

     

     

    查询所有记录

    select * from tname;

    db.tname.find()

    查询所有列

    select id from tname;

    db.tname.find({},{id:1})

    条件查询

    select * from tname where id=2;

    db.tname.find({id:2})

    条件查询

    select * from tname where id < 2;

    db.tname.find({id:{$lt:2}})

    条件查询

    select * from tname where id >=2;

    db.tname.find({id:{$gte:2}})

    条件查询

    select * from tname where id=2
    and name='steve';

    db.tname.find({id:2,
    name:'steve'})

    条件查询

    select * from tname where id=2
    or name='steve';

    db.tname.find($or:[{id:2},
    {name:'steve'}])

    条件查询

    select * from tname limit 1;

    db.tname.findOne()

     

     

     

    模糊查询

    select * from tname where name
    like "%ste%";

    db.tname.find({name:/ste/})

    模糊查询

    select * from tname where name
    like "ste%";

    db.tname.find({name:/^ste/})

     

     

     

    获取表记录数

    select count(id) from tname;

    db.tname.count()

    获取有条件
    的记录数

    select count(id) from tname
    where id=2;

    db.tname.find({id:2}).count()

    查询时去掉
    重复值

    select distinct(last_name)
    from tname;

    db.tname.distinct('last_name')

     

     

     

    正排序查询

    select *from tname order by id;

    db.tname.find().sort({id:1})

    逆排序查询

    select *from tname
    order by id desc;

    db.tname.find().sort({id:-1})

     

     

     

    取存储路径

    explain select * from tname
    where id=3;

    db.tname.find({id=3}).explain()

     

     

    1. 存储类型

    mongodb文档类似于json,但不是完全的json

    json只有六种类型:nullbool, 数字,字符串,数组,对象。

    但是mongo的文档在json的基础上还扩展了几种类型, 比如,日期类型,整数,浮点数。

    mongodb真正存储在磁盘上是使用bsonbinary json)。

    2. 常用数据类型

    null: 表示不存在或空值。

    bool true false

    string: 字符串, 用引号包含。

    3. 数字

    json中只有数字类型。

    mongodb中有三种:

    32位整数

    64位整数

    64为浮点数

    数字默认是按照浮点数存储的。

    4. 日期

    日期类型存储从标准纪元开始的毫秒数。

    [plain] view plain copy

    1. {"x" : new Date()}  

    5. 数组

    可以存储数组

    [plain] view plain copy

    1. {"x" : ["a", "b", "c"]}  

    6. 内嵌文档

    把一个文档作为另一个文档的一个值。

    [plain] view plain copy

    1. {“x” : {"foo" : "bar"}}  

    7. _id

    mongdb文档必须有个“_id”key,默认是个ObjectId对象。

    ObjectId使用12个字节存储空间,每个字节两位16进制数字,是24位字符串。

    分配如下图所示

    前四个字节为时间戳。由于在前面,使Objectid大概按照时间戳排序。将其作为索引提高效率。

    pid为进程标识符,

    计数器为每秒的计数器。每秒可以生成(16*16 = 256)的三次方。

    _id可以程序来生成,不用系统自动,这就需要保证每个id不能重复。

    8. 其他

    文档中还可以包含正则表达式, javascript代码,二进制数据。

    查看全部数据表

    > use ChatRoom
    switched to db ChatRoom
    > show collections
    Account
    Chat
    system.indexes
    system.users

    创建数据表

    > db.createCollection("Account")
    {"ok":1}

    > db.createCollection("Test",{capped:true, size:10000}) { "ok" : 1 }

    {"ok":1}

    -- 说明

    capped:true,表示该集合的结构不能被修改;

    size:在建表之初就指定一定的空间大小,接下来的插入操作会不断地按顺序APPEND数据在这个预分配好空间的文件中,如果已经超出空间大小,则回到文件头覆盖原来的数据继续插入。这种结构保证了插入和查询的高效性,它不允许删除单个记录,更新的也有限制:不能超过原有记录的大小。这种表效率很高,它适用于一些暂时保存数据的场合,比如网站中登录用户的session信息,又比如一些程序的监控日志,都是属于过了一定的时间就可以被覆盖的数据。

    修改数据表名

    > db.Account.renameCollection("Account1")
    { "ok" : 1 }

    数据表帮助主题help

    > db.Account.help()
    DBCollection help
            db.Account.find().help() - show DBCursor help
            db.Account.count()
            db.Account.dataSize()
            db.Account.distinct( key ) - eg. db.Account.distinct( 'x' )
            db.Account.drop() drop the collection
            db.Account.dropIndex(name)
            db.Account.dropIndexes()
            db.Account.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups
            db.Account.reIndex()
            db.Account.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return.
                                                          e.g. db.Account.find( {x:77} , {name:1, x:1} )
            db.Account.find(...).count()
            db.Account.find(...).limit(n)
            db.Account.find(...).skip(n)
            db.Account.find(...).sort(...)
            db.Account.findOne([query])
            db.Account.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } )
            db.Account.getDB() get DB object associated with collection
            db.Account.getIndexes()
            db.Account.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )
            db.Account.mapReduce( mapFunction , reduceFunction , <optional params> )
            db.Account.remove(query)
            db.Account.renameCollection( newName , <dropTarget> ) renames the collection.
            db.Account.runCommand( name , <options> ) runs a db command with the given name where the first param is the collection name
            db.Account.save(obj)
            db.Account.stats()
            db.Account.storageSize() - includes free space allocated to this collection
            db.Account.totalIndexSize() - size in bytes of all the indexes
            db.Account.totalSize() - storage allocated for all data and indexes
            db.Account.update(query, object[, upsert_bool, multi_bool])
            db.Account.validate() - SLOW
            db.Account.getShardVersion() - only for use with sharding

    查看全部表记录

    > db.Account.find()
    { "_id" : ObjectId("4df08553188e444d001a763a"), "AccountID" : 1, "UserName" : "libing", "Password" : "1", "Age" : 26, "Email" : "libing@126.com", "RegisterDate" : "2011-06-09 16:31:25" }
    { "_id" : ObjectId("4df08586188e444d001a763b"), "AccountID" : 2, "UserName" : "lb", "Password" : "1", "Age" : 25, "Email" : "libing@163.com", "RegisterDate" : "2011-06-09 16:36:95" }

    --SELECT * FROM Account

    说明:

    默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。
    可以通过DBQuery.shellBatchSize设置每页显示数据的大小。如:DBQuery.shellBatchSize = 5,这样每页就显示5条记录了。

    > db.Test.find()
    { "_id" : ObjectId("4df6d55407444568af61cfea"), "TestID" : 1 }
    { "_id" : ObjectId("4df6d55907444568af61cfeb"), "TestID" : 2 }
    { "_id" : ObjectId("4df6d55b07444568af61cfec"), "TestID" : 3 }
    { "_id" : ObjectId("4df6d55e07444568af61cfed"), "TestID" : 4 }
    { "_id" : ObjectId("4df6d56207444568af61cfee"), "TestID" : 5 }
    { "_id" : ObjectId("4df6d56507444568af61cfef"), "TestID" : 6 }
    { "_id" : ObjectId("4df6d56807444568af61cff0"), "TestID" : 7 }
    { "_id" : ObjectId("4df6d56b07444568af61cff1"), "TestID" : 8 }
    { "_id" : ObjectId("4df6d56e07444568af61cff2"), "TestID" : 9 }
    { "_id" : ObjectId("4df6d57a07444568af61cff3"), "TestID" : 10 }
    { "_id" : ObjectId("4df6d57d07444568af61cff4"), "TestID" : 11 }
    { "_id" : ObjectId("4df6d58007444568af61cff5"), "TestID" : 12 }
    { "_id" : ObjectId("4df6d58307444568af61cff6"), "TestID" : 13 }
    { "_id" : ObjectId("4df6d58e07444568af61cff7"), "TestID" : 14 }
    { "_id" : ObjectId("4df6d59207444568af61cff8"), "TestID" : 15 }
    { "_id" : ObjectId("4df6d59607444568af61cff9"), "TestID" : 16 }
    { "_id" : ObjectId("4df6d59c07444568af61cffa"), "TestID" : 17 }
    { "_id" : ObjectId("4df6d5a307444568af61cffb"), "TestID" : 18 }
    { "_id" : ObjectId("4df6d5a607444568af61cffc"), "TestID" : 19 }
    > DBQuery.shellBatchSize
    20
    > DBQuery.shellBatchSize = 5
    5
    > db.Test.find()
    { "_id" : ObjectId("4df6d55407444568af61cfea"), "TestID" : 1 }
    { "_id" : ObjectId("4df6d55907444568af61cfeb"), "TestID" : 2 }
    { "_id" : ObjectId("4df6d55b07444568af61cfec"), "TestID" : 3 }
    { "_id" : ObjectId("4df6d55e07444568af61cfed"), "TestID" : 4 }
    { "_id" : ObjectId("4df6d56207444568af61cfee"), "TestID" : 5 }
    has more
    > it
    { "_id" : ObjectId("4df6d56507444568af61cfef"), "TestID" : 6 }
    { "_id" : ObjectId("4df6d56807444568af61cff0"), "TestID" : 7 }
    { "_id" : ObjectId("4df6d56b07444568af61cff1"), "TestID" : 8 }
    { "_id" : ObjectId("4df6d56e07444568af61cff2"), "TestID" : 9 }
    { "_id" : ObjectId("4df6d57a07444568af61cff3"), "TestID" : 10 }
    has more
    > it
    { "_id" : ObjectId("4df6d57d07444568af61cff4"), "TestID" : 11 }
    { "_id" : ObjectId("4df6d58007444568af61cff5"), "TestID" : 12 }
    { "_id" : ObjectId("4df6d58307444568af61cff6"), "TestID" : 13 }
    { "_id" : ObjectId("4df6d58e07444568af61cff7"), "TestID" : 14 }
    { "_id" : ObjectId("4df6d59207444568af61cff8"), "TestID" : 15 }
    has more
    > it
    { "_id" : ObjectId("4df6d59607444568af61cff9"), "TestID" : 16 }
    { "_id" : ObjectId("4df6d59c07444568af61cffa"), "TestID" : 17 }
    { "_id" : ObjectId("4df6d5a307444568af61cffb"), "TestID" : 18 }
    { "_id" : ObjectId("4df6d5a607444568af61cffc"), "TestID" : 19 }
    > it
    no cursor

    查询一条记录

    > db.Account.findOne()
    {
            "_id" : ObjectId("4ded95c3b7780a774a099b7c"),
            "UserName" : "libing",
            "Password" : "1",
            "Email" : "libing@126.cn",
            "RegisterDate" : "2011-06-07 11:06:25"
    }

    --SELECT TOP 1 * FROM Account

     查询聚集中字段的不同记录

    > db.Account.distinct("UserName")

    --SELECT DISTINCT("UserName")  FROM Account

     查询聚集中UserName包含“keyword”关键字的记录

    db.Account.find({"UserName":/keyword/})

     --SELECT * FROM Account WHERE UserName LIKE '%keyword%'

    查询聚集中UserName"keyword" 开头的记录

    > db.Account.find({"UserName":/^keyword/})

    --SELECT * FROM Account WHERE UserName LIKE 'keyword%'

    查询聚集中UserName“keyword”结尾的记录

    > db.Account.find({"UserName":/keyword$/})

    --SELECT * FROM Account WHERE UserName LIKE '%keyword' 

    查询聚集中指定列

    > db.Account.find({},{"UserName":1,"Email":1})    --1:true

    --SELECT UserName,Email FROM Account

     查询聚集中排除指定列

    > db.Account.find({},{"UserName":0})    --0:false

    查询聚集中指定列,且Age > 20

    > db.Account.find({"Age":{"$gt":20}},{"UserName":1,"Email":1})

    --SELECT UserName,Email FROM Account WHERE Age > 20 

    聚集中字段排序 

    > db.Account.find().sort({"UserName":1}) -- 升序
    > db.Account.find().sort({"UserName":-1}) --降序

    --SELECT * FROM Account ORDER BY UserName ASC

    --SELECT * FROM Account ORDER BY UserName DESC 

    统计聚集中记录条数

    > db.Account.find().count()

    --SELECT COUNT(*) FROM Account 

    统计聚集中符合条件的记录条数

    > db.Account.find({"Age":{"$gt":20}}).count()

    -- SELECT COUNT(*) FROM Account WHERE Age > 20

    统计聚集中字段符合条件的记录条数

    > db.Account.find({"UserName":{"$exists":true}}).count()

    --SELECT COUNT(UserName) FROM Account 

    查询聚集中前5条记录 

    > db.Account.find().limit(5)

    --SELECT TOP 5 * FROM Account 

    查询聚集中第10条以后的记录

    > db.Account.find().skip(10)

    --SELECT * FROM Account WHERE AccountID NOT IN (SELECT TOP 10 AccountID FROM Account) 

    查询聚集中第10条记录以后的5条记录

    > db.Account.find().skip(10).limit(5)

    --SELECT TOP 5 * FROM Account WHERE AccountID NOT IN (SELECT TOP 10 AccountID FROM Account)

    or查询

    > db.Account.find({"$or":[{"UserName":/keyword/},{"Email":/keyword/}]},{"UserName":true,"Email":true})

    --SELECT UserName,Email FROM Account WHERE UserName LIKE '%keyword%' OR Email LIKE '%keyword%' 

    添加新记录

    > db.Account.insert({AccountID:2,UserName:"lb",Password:"1",Age:25,Email:"libing@163.com",RegisterDate:"2011-06-09 16:36:95"})

    修改记录

    > db.Account.update({"AccountID":1},{"$set":{"Age":27,"Email":"libingql@163.com"}})
    > db.Account.find({"AccountID":1})
    { "AccountID" : 1, "Age" : 27, "Email" : "libingql@163.com", "Password" : "1", "RegisterDate" : "2011-06-09 16:31:25", "UserName" : "libing", "_id" : ObjectId("4df08553188e444d001a763a") }

    > db.Account.update({"AccountID":1},{"$inc":{"Age":1}})
    > db.Account.find({"AccountID":1})
    { "AccountID" : 1, "Age" : 28, "Email" : "libingql@163.com", "Password" : "1", "RegisterDate" : "2011-06-09 16:31:25", "UserName" : "libing", "_id" : ObjectId("4df08553188e444d001a763a") }

    删除记录

    > db.Account.remove({"AccountID":1}) --DELETE FROM Account WHERE AccountID = 1

    > db.Account.remove({"UserName":"libing"}) --DELETE FROM Account WHERE UserName = 'libing'

    > db.Account.remove({"Age":{$lt:20}}) --DELETE FROM Account WHERE Age < 20
    > db.Account.remove({"Age":{$lte:20}}) --DELETE FROM Account WHERE Age <= 20
    > db.Account.remove({"Age":{$gt:20}}) --DELETE FROM Account WHERE Age > 20
    > db.Account.remove({"Age":{$gte:20}}) --DELETE FROM Account WHERE Age >= 20
    > db.Account.remove({"Age":{$ne:20}}) --DELETE FROM Account WHERE Age != 20

    > db.Account.remove()    --全部删除
    > db.Account.remove({})  --全部删除

  • 相关阅读:
    git使用
    silverlight与wcf双向通讯 例子
    Oracle 存储过程
    C# 视频教程
    佩服的技术大牛 “赵劼”
    setTimeout setInterval
    js闭包
    MVC Razor视图引擎控件
    MVC json
    springboot创建多环境profile打包
  • 原文地址:https://www.cnblogs.com/baizhanshi/p/10026662.html
Copyright © 2011-2022 走看看