备份一下NOSQL笔记

linux:
    kill  -2  进程号:强制关闭某程序,mongod进程号可通过ps -ef | grep mongod命令获取
    ps -ef | grep mongod:查询mongodb运行状态
    reboot:重启计算机
    /user/local/mongodb/conf/mongodb.conf:linux中mongodb配置文件路径
启动mongodb:
    mongodb  -f(或--config)  .....  /mongodb.conf    //利用配置文件启动服务端
    mongo   //启动客户端
    mongo  --host  127.0.0.1   --port 3333 :启动主机号为127.0.0.1,及端口号为 3333

windows平台安装:
    1、命令行参数
        (1)创建三个文件夹(data、db.logs)和一个日志文件(mongodb.log)
            存储数据库文件        存储日志文件
        (2)启动MongoDB服务器命令
            mongod   --dbpath  C:\Users\86186\Desktop\NOSQL\mongodb-win32-x86_64-2012plus-4.2.2\data\db  --logpath    C:\Users\86186\Desktop\NOSQL\mongodb-win32-x86_64-2012plus-4.2.2\logs\mongodb.log    --logappend

        mongod --dbpath C:\replicaset2\data\db  --logpath C:\replicaset2\logs\mongodb.log  --port 2222   --replSet  hbsi0
            //replSet   hbsi0   :创建一个名为hbsi0的副本集
    2.配置文件:(放置在mongod.conf)
    storage:
    dbPath: DAMongoDBimongodb-win32-x86_64-2012plus-4.2.2%ydataldbsystemLog:
    destination: file
    path: D:MongoDBmongodb-win32-x86_64-2012plus-4.2.2logsimongodblogiogAppend: true
      
ACID原则:???
    提供了稳定性和可靠性
事务:???

关系型数据库和非关系型数据库:
    ?????
    关系型数据库:二维表结构(拥有ACID原则)
        扩展性不如非关系型数据库
        
    非关系型数据库:高并发读写,高扩展,高效率存储和访问需求(不具备ACID原则),分布式
NOSQL与mysql的区别:
    mysql是传统的关系型数据库
        示例:
            select * from  表名
    NOSQL是非关系型数据库
        极具灵活性,易扩展
NOSQL数据库:键值对,文档,列式,图形    
    键值对:(key:value)
        {学号:“1001”,姓名:“小明”,年龄:“20”,班级:“一班”}//示例(支持内嵌)
        //键值对感觉有点像Python中的字典,css中的属性
        //也可当做对象来进行处理,但是属性可任意删改添加。感觉每个每个文档都是独立的个体

关于mongodb:
    关系型数据库    mongodb(非关系型数据库)
    增删改查        增删改查
    索引        索引
    数据库        数据库
    数据表        集合
    记录        文档
    //集合类似于关系型数据库(例如mysql)中的数据表,但是mongodb不需要定义任何模式
    //每个集合都可以包含无限数量的文档,而文档是集合中的基本单元
    示例:
    {学号:“1001”,姓名:“小明”,年龄:“20”,班级:“一班” 成绩:[{数学:80,语文:90}]   
    {学号:“1002”,姓名:{姓:“小”,名:“李”},年龄:“20”,班级:“一班”,爱好:["读书","篮球"]}
    //注意:疑似内嵌时有列表的概念,列表内也可以嵌套集合
    一条记录或者说一个集合转换成一个文档
关于集合:
    集合分为“一般集合”和“上限集合”
    一般集合:该集合没有固定的形式(需要注意的是:通常插入集合的数据一般都具有关联性)
    上限集合:该集合会限制集合的容量大小,在数据存满时,会从头进行覆盖,进行循环写入。

关于文档:
    文档以键对值的形式存储在集合中,
    键(key)具有唯一性,且为字符串类型,值(value)可以是各种类型
    每个文档都有一个默认的_id键,类似于“关系型数据库”中的主键,该键在同一个集合中必须是唯一的
如果用户不手动设置,会自动生成一个位移的ObjectId值进行填充
    关于_id:
        详细在NoSQL课本第17页。   ╮(╯▽╰)╭
mongo.exe:启动MongoDB Shell客户端
mongod.exe:启动MongoDB服务器
Mongodb命令:
    show  collections:显示当前下所有集合
    show   dbs:显示所有数据库情况
    db:显示数据库的当前对象
    use  数据库名:新建数据库
        //如果要创建的数据库存在,切换到该数据库
        //如果要创建的数据库不存在,创建该数据库
    db.dropDatabase():删除数据库
        //注意:为了防止误删可执行命令db验证当前数据库是否为指定删除的数据库
    db.集合名.drop():删除集合
    db.createCollection(“集合名称”):显式创建集合
    db.集合名.insert({name:“tom”,age:20})隐式创建(在创建文档的同时,如果集合不存在,则自动将集合创建出来)
        //隐式创建参数为  文档
    
    db.collectionName.drop():删除数据库中的集合
    db.collectionName.insert():向集合中插入文档
    db.collectionName.find():查询文档内容
    db.集合名.find().pretty():格式化查询返回的结果
    
文档(增删改查):
    db.集合名.insert(文档):单文档插入
    db.集合名.save(文档):单文档插入
    db.集合名.insertMany([文档1,文档2,...]):多文档插入(插入时需要用数组,文档作为数组元素)
        //文档示例:
            {name:“tom”,age:20}    
    
    db.集合名.update(criteria,objNem,upsert,multi):文档数据更新        
        critera:筛选条件
        objNem:更新的数据(注意:更新的数据会直接覆盖文档)
            //可以使用      {$set:{要更新的数据}}
        upsert:不存在更新对象时是否插入,默认为false
        multi:默认为false,只更新查找的第一个文档,反之更新全部文档
        
    db.集合名.remove({删除文档条件}):删除指定文档
    db.集合名.remove({}):删除全部文档

    db.集合名.find():查询所有文档
    db.集合名.find().pretty():格式化查询返回结果
    db.集合名.find({查询条件}).hint({键名:-1或1}):强制查询指定的索引
        //1  是升序    -1  是降序
    db.集合名.find(条件语句).explain():查看当前语句的查询计划
    *****关于按条件查询:
        逻辑操作符:
        $and:与        
        $or:或
            示例:
                db.集合名.find({$and:[{key1:value1},{key2:value2}]})
                            ({$or:[...]})
        比较操作符:
        $gt:大于                    {age:{$gt:18}}   :age>18
        $lt:小于          {age:{$lt:18}}  :age<18
        $gte:大于等于      ......
        $lte:小于等于
        $ne:不等于
        $in:包含         {_id:{$in:["1","3"]}}
        $nin:不包含     {_id:{$nin:["1","3"]}}
    关于正则表达式的使用:
        (1)/^以什么开头/
            db.集合名.find({集合名:/^专家/})
        (2)/以什么结尾$/
            db.集合名.find({集合名:/关键字$/})
        (3)//包含什么
            db.集合名.find({集合名:/关键字/})
    关于嵌套文档查询:
        db.集合名.find({<key>.<key>:<value1>})
        示例:db.comment.fin("phone.homePhone":“82174911”)


1.Null 类型查询
 db.comment.find({"state":null}).pretty()

  2. 关于正则表达式查询:
(1)以/^以什么开头/
   查询集合comment中评论内容content值以"专家"开头的文档?
   db.comment.find({content:/^专家/})

  (2) /以什么结尾$/
   查询集合comment中评论内容content值以"水" 结尾的文档?
  db.comment.find({content:/水$/})
 
  (3) /包含什么内容/
  查询集合comment 中 评论内容content包含 "冬天"  的文档?
   db.comment.find({content:/冬天/})
  
  3.  嵌套文档查询之精确查询
     查询comment集合中phone包含的子文档中homePhone的值为62771541且mobilePhone的值为13262984142的文档?
   db.comment.find({"phone.mobilePhone":"13065840128"})

  
  4. 嵌套文档查询之点查询
 db.集合名.find({<key>.<key1>:<value1>})
  查询comment集合中phone包含的子文档中homePhone的值为82174911的文档?
   db.comment.find({"phone.homePhone":"82174911"})

   db.comment.find({"phone.mobilePhone":"1306580128"})


  聚合管道
  $group    [{$group:{"_id":"$class"}}]                    group  ny  class
  $limit       $limit:5                                     limit 5,5  分页
  $match                                                   过滤查找
  $sort       {$sort:{age:-1}}                        order by       排序
  $project   {$project:{stuid:1,name:1,_id:0}}       
  $skip    {$skip:5}
关于分组:
  $group  分组
   db.集合名.aggregate([{$group:{_id:"$<key2>"}}])  

   实例:  在stu集合中按class 键进行分组操作?
    db.stu.aggregate([{$group:{"_id":"$class"}}])
   将集合comment中的文档按userid进行分组?
   db.comment.aggregate([{$group:{"_id":"$userid"}}])

   将集合comment中的文档按state 进行分组?
  db.comment.aggregate([{$group:{"_id":"state"}}])

   $limit   :限制mongodb聚合管道返回的文档数
   db.集合名.aggregate({$limit:整型数字})


{name:{firstname:"wang")    模糊查询        like '王%'
db.stu.find({ "name.firstname":"wang"))
{name:{firstname:"li",lastname:"ming"}精确查询
db.stu.find({name:{firstname:"li" ,lastname:" ming")
关于筛选$match:
    db.集合名.aggregate([{$match:{<key>:<value>}}])
                          过滤条件
按条件查询    查询条件                    过滤条件
db.comment.find(i"_id":"1"))        db.comment.aggregate({$match:{"_id":1))
按照查询条件将所需文档显示出来    将输入的文档按照过滤条件处理之后传递给后续的管道操作符
(主查阅)                (有返回结果,主后续)


包含子文档
   {name:{firstname:"wang"}}   模糊查询        like  '王%'
   db.stu.find({"name:firstname":"wang"})   name 的子文档为firstname

  {name:{firstname:"li",lastname:"ming"}}    精确查询
  db.stu.find({name:{firstname:"li",lastname:"ming"}})

   查询null:db.stu.find({"name":null})


$match
语法: db.COLLECTION_NAME.aggregate([{$macth:{<key>:<value>}}])
                        过滤条件

按条件查询          查询条件                过滤条件
db.comment.find({"_id":"1"})           db.comment.aggregate({$match:{"_id":"1"}})
按照查询条件将所需文档显示出来       将输入的文档按照过滤条件处理之后传递给后续的管道操作符


[{$match},{$project},{$sort},{$limit}]


$sort 排序  (stu集合)          mysql                正序 (升序)   倒叙 (降序)
语法:{$sort:{待排序的键名:1或者-1}}                     select * from student order by age desc
说明:1 代表升序  ,  -1代表降序
实例1: 对stu集合中的age键进行降序排序?
db.stu.aggregate({$sort:{age:-1}})
实例2: 对stu集合中的age键进行升序排序?
db.stu.aggregate({$sort:{age:1}})


db.comment.aggregate({$sort:{age:1}})

$project 映射
        {$project:{age:1}}
语法:{$project:{键名:0或者1}}
说明:
 键名:指的是用户想要隐藏或者显示的键的名字。
  0:隐藏前边指定的键的键值对
  1:只显示前边指定的键的键值对,同时如果不明确的隐藏_id键值对,则返回结果会包含_id和指定要显示的键值对
实例1:在查询结果中不显示集合comment中的age 键值对?
db.comment.aggregate({$project:{age:0}})
实例2:在查询结果中显示集合comment中的age 键值对?
db.comment.aggregate({$project:{age:1}})
实例3:在查询结果中只显示集合comment中的age 键值对?
db.comment.aggregate({$project:{_id:0,age:1}})

db.comment.aggregate({$project:{_id:0,nickname:1)

$skip 跳过指定数量的文档,返回剩余的文档
//注意:{$skip:跳过的文档个数}
实例1:在comment集合中跳过5个文档?
    db.comment.aggregate({$skip:5})    
    db.comment.aggregate({$skip:3))
实例2:在comment集合中显示第2到4个文档?    {$skip:1},{$limit:3}
    db.comment.aggregate({$skip:1},{$limit:3}})


关于管道表达式:
    管道表达符
    $sum
    语法:   
    db.集合名.aggregate({$group:{"_id":"$分组字段名","自定义名字":{$sum:"$需要进行累加的字段名"}}})    
    
    实例1:将集合product 中的 文档按类型type进行分组并计算各个分组的价格price总和?
    db.product.aggregate({$group:{"_id":"$type","价格总和":{$sum:"$price"}}})

    实例2:在集合comment中,计算每篇文档的评论人数?
    db.comment.aggregate({$group:{"_id":"$articleid","评论人数":{$sum:1}}})


    $avg平均值

    实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price平均值?
    db.product.aggregate({$group:{"_id":"$type","价格平均值":{$avg:"$price"}}})

    实例2:在集合comment中,计算每篇文章评论人的平均年龄?
    db.comment.aggregate({$group:{"_id":"$articleid","评论人喜欢的数字的平均值":{$avg:"$likenum"}}})

    $min

    实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price最小值?
    db.product.aggregate({$group:{"_id":"$type","最小值":{$min:"$price"}}})

    $max

    实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price最大值?
    db.product.aggregate({$group:{"_id":"$type","最大值":{$max:"$price"}}})

    $push

    实例1:将集合product中的文档按照类型type进行分组,并将各个分组的产品插入到一个数组tags中?
    db.product.aggregate({$group:{"_id":"$type","tags":{$push:"$name"}}})
    实例2:将集合comment中,罗列出每篇文章的评论人昵称?
    db.comment.aggregate({$group:{"_id":"$articleid","tags":{$push:"$nickname"}}})

    $first
    实例1:将集合product中的文档按类型type进行分组,并获取各个分组中第一个产品?
    db.product.aggregate({$group:{"_id":"type","第一个产品":{$first:"$name"}}})

    $last


    (1)分组语句
    db.product.aggregate({$group:{"_id":"$type"}})
    (2)累加语句


关于mapReduce的操作:
    db.集合名.mapReduce(
        function(){
            //map函数
            emit(key,value);
        },
        function(key,values){ //key,values参数名不需要更改
            //reduce函数
            return reduceFunction   //例  return   Array.sum(values)
        },
        {
            query:条件,
            out:New_COLLENTION_NAME,
            sort:条件,
            limit:number
        }
        )
    map函数作用:调用emit方法,遍历集合中的所有文档,返回键值对,并将结果输入到reduce函数中
    reduce函数作用:将key-values变为key-value,将数组变为单一的值
    query参数:它的值为条件,用于筛选文档(符合条件才会调用map函数)
    out参数:值为集合,用于存放统计后的结果
    sort参数:可选项,可结合limit使用,用于排序操作
    limit参数:可选项,限定输入map函数的文档数量
关于索引部分:
    db.集合名.getIndexes():查看索引
    db.集合名.totalIndexSize():查看索引大小
    db.集合名.createIndex(keys,options):创建索引
        keys:类型是文档类型(keys:{age:1})
            //  指定值为1,升序,指定为-1,则是倒序
        options:有两个参数(书67页)(可选项)
            unique:创建的索引是否唯一,ture(唯一),false(默认值,不唯一)
            name:指定索引的名字
        示例:db.集合名.createIndex({键名:1或-1},{name:“索引名称”})
    db.集合名.nesureIndex({key:1},{name:indexName}):在查询字段上添加索引(与cerateIndex一样)
        key:键名
        name:自定义索引名
    db.集合名.dropIndex(index):删除单个索引
    db.集合名.dropIndexes():删除所有索引
    
    db.集合名.find({查询条件}).hint({键名:-1或1}):强制查询指定的索引
        //1  是升序    -1  是降序
    db.集合名.find().explain():
扩展:mongodb
    支持for循环:
        示例:
            for(var   i=0;i<200000;i++){
                db.books.insert({number:i,name:i+"book"})
            }
    支持new   Date();
    支持var   变量名   的创建;

    var start=new Date();
    db.books.find({number:15870})
    var end=new Date();
    end-start
关于副本集:

    初始化副本集:
        db.runCommand({"replSetlnitiate":{
                        "_id":"hbsi0",
                       members:[
                       {
                        "_id":1,
                         host:"127.0.0.1:2222"
                                 },
                       {
                        "_id":2,
                         host:"127.0.0.1:3333"
                                 }
                    
    ]}})
    rs.add("127.0.0.1:4444"):添加副本节点,该节点主机号为127.0.0.1,及端口号为4444
    rs.addArb("127.0.0.1:4444"):添加仲裁节点,该节点主机号为127.0.0.1,及端口号为4444
    rs.status():查看副本集成员状态信息
    rs.slaveOk()开启副本节点的读取权限(默认情况下副本节点不可以查询副本集中的内容)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值