zoukankan      html  css  js  c++  java
  • MongoDB入门理解

          MongoDB中,一个数据库包含多个集合(类似关系型数据库的表),一个集合包含多个文档(类似关系型数据库的一行记录),文档存储方式是类JSON的BSON存储数据,BSON可以理解为在JSON格式上添加了一些JSON没有的数据类型。

    文档:

            两个文档之间有 嵌入式关系 和 引用式关系

    集合:

            集合就是各种文档的集合,MongoDB的同一个集合可以存储不同结构的多个文档,例如:

    {"company":"Chenshi keji"} {"people":"man","name":"peter"}

    元数据

    数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.* DBNAME 可用 db 或数据库名替代

    • DBNAME.system.namespaces :列出所有名字空间
    • DBNAME.system.indexs :列出所有索引
    • DBNAME.system.profile :列出数据库概要信息
    • DBNAME.system.users :列出访问数据库的用户
    • DBNAME.system.sources :列出服务器信息

    数据库操作:

    1. show dbs 查看所有数据库
    2. db 查看当前的数据库对象或者集合
    3. use dbName 连接到dbName数据库

    集合的操作:

    • 创建集合    
    db.createCollection("users")   //无参
    db.createCollection("shiyanlou2", { capped : 1, autoIndexID : 1, size : 6142800, max : 10000 } )  

    参数描述:

    • capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;
    • autoIndexID:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id field.s 上自动创建索引;
    • size:如果 capped 为 true 需要指定,指定参数的最大值,单位为 byte;
    • max:指定最大的文档数。 在 Mongodb 中也可以不用创建集合,因为在创建文档的时候也会自动的创建集合。
    • 查看集合
    show collections
    • 删除集合
    db.users.drop

    文档的操作:

    • 数据的插入
    insert()
    
    db.users.insert([
    
    ... { name : "jam",
    
    ... email : "jam@qq.com"... },
    
    ... { name : "tom",
    
    ... email : "tom@qq.com"... }
    
    ... ])
    
            save()
    
    db.users.save([
    
    ... { name : "jam",
    
    ... email : "jam@qq.com"... },
    
    ... { name : "tom",
    
    ... email : "tom@qq.com"... }
    
    ... ])
    • 数据的查询

            查询整个集合

    db.users.find()             
    
    db.users.find().pretty()   //更美观的显示方式

            and查询

    db.users.find({ key1: value1, key2: value2 }).pretty()  

            or查询

    db.users.find(
    
    {
    
        $or: [
    
            {key1: value1},
    
            {key2: value2}
    
            ]
    
        }
    
    ).pretty()

        同时使用and和or

    db.post.find({
    
        "number": {$gt:10},
    
        $or: [
    
            {"by": "shiyanlou"},
    
            {"title": "MongoDB Overview"}
    
            ]
    
    }).pretty()

        {$gt:10} 表示大于10,另外,$lt 表示小于,$lte 表示小于等于,$gte 表示大于等于,$ne 表示不等于

    • 数据的更新
    db.shiyanlou.update({"user_id":2,"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
    • 将 user_id=2 的文档的 e-mail 改为 group@qq.com
    • 第一个大括号内容标示查找条件,第二个大括号内容则表示更新后的数据
    • 默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true
    • 替换已存在的数据
    db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})

           _id 对应的是要替换文档的 _id

    • 删除数据
    db.shiyanlou.remove({"name":"Bob"})
    • 条件操作符
    • 双精度型-1
    • 字符串-2
    • 对象-3
    • 数组-4
    • 二进制数据-5
    • 对象ID-7
    • 布尔类型-8
    • 数据-9
    • 空-10
    • 正则表达式-11
    • JS代码-13
    • 符号-14
    • 有作用域的JS代码-15
    • 32位整型数-16
    • 时间戳-17
    • 64位整型数-18
    • Min key-255
    • Max key-127

    db.shiyanlou.find({"name":{$type:2}})

    查找name是字符串的文档记录。

    • limit与skip
    db.shiyanlou.find().limit(1)    //读取一条记录,默认是排在最前面的那条被读取
    
    db.shiyanlou.find().limit(1).skip(1)       //读取时跳过指定数量的记录
    • sort()
    db.COLLECTION_NAME.find().sort({KEY:1|-1})     //升序1 降序-1

    例如:

    db.shiyanlou.find().sort({"time":1}
    • 索引ensureIndex()

    索引是特殊的数据结构,存储在容易遍历读取的数据集合里,是对数据库集合中的一个或者多个文档的值进行排序的一种结构。

    db.COLLECTION_NAME.ensureIndex({KEY:1|-1})       //升序1 降序-1

    例如:

    db.shiyanlou.ensureIndex({"name":1})
    • 查询分析

         explain()显示查询的详细元数据

    db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

          结果中字段解释:

    • indexOnly:为 true ,表示我们使用了索引;
    • cursor:因为这个查询使用了索引,MongoDB 中索引存储在 B 树结构中,所以这是也使用了 BtreeCursor 类型的游标。如果没有使用索引,游标的类型是 BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的 system.indexes 集合(系统自动创建)来得到索引的详细信息;
    • n:当前查询返回的文档数量;
    • nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好;
    • millis:当前查询所需时间,毫秒数;
    • indexBounds:当前查询具体使用的索引。
  • 相关阅读:
    【原创】python中文编码问题:控制窗口能输出中文,到文本文件里乱码
    【转载】在notepad++中直接运行python代码
    报错The reference to entity "characterEncoding" must end with the ';' delimiter
    原码, 反码, 补码 详解
    GC 过程图解
    Java NIO:浅析I/O模型
    Java类加载器的工作原理
    修改classloader的加载路径
    ThreadLocal 源码分析
    冒泡排序、快速排序、堆排序
  • 原文地址:https://www.cnblogs.com/lingqinyu/p/8877754.html
Copyright © 2011-2022 走看看