zoukankan      html  css  js  c++  java
  • 学习使用MongoDB数据库查询数据

    使用MongoDB数据库查询数据

    1 MongoDB简介

    1.1 NoSQL简介

    NoSQL(NoSQL,Not Only SQL ),意即"不仅仅是SQL"。
    1970年,关系型数据库诞生,用于规范性的管理数据。NoSQL 是一项全新的数据库革命性运动,提倡运用非关系型的数据存储。NoSQL用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
    知名数据库:列存储HBase,文档存储MongoDB,键值存储Redis。

    1.2 MongoDB简介

    MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 SQL的table。字段值可以包含其他文档,数组等。

    2 MongoDB基础概念

    • mongodb中基本概念有文档、集合、数据库。
    • 一个mongodb中可以建立多个数据库。MongoDB的默认数据库为"db",该数据库存储在data目录中。
    • 集合就是 MongoDB 文档组,类似于 RDBMS 中的table。相对于sql,集合没有固定的结构,对集合可以插入不同格式和类型的数据。
    • 文档是一个键值(key-value)对,类似于 RDBMS 中的record。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

    2.1 MongoDB的数据类型

    MongoDB中常用的几种数据类型:
    • String:字符串类型。
    • integer:整型数值,用于存储数值型数据。
    • boolean:布尔值(真或假)。用于存储布尔类型。

    2.2 MongoDB的运算符

    数学运算符: 略
    条件运算符:
    • (>) 大于:(gt • (<) 小于:)lt
    • (>=) 大于等于:$gte
    • (<= ) 小于等于: (lte )type运算符:使用数字代表数据类型。比如db.tableName.find({"column1" : {$type : 1}})表示获取字段column1中数据类型为double的记录。
    • Double:1
    • String:2
    • Object:3
    • Array:4
    • Boolean:8
    • Date :9
    • Null:10

    2.3 数据类型转换

    instance of:判断类型。
    NumberInt函数:字符串转换为int类型。

    3 MongoDB的数据库

    SQL和MongoDB的对比

    3.1 数据库命名规则

    推荐的命名规范:
    • 不能是空字符串("")。
    • 不得含有' '(空格)、.、$、/、和 (空宇符)。
    • 应全部小写。
    • 最多64字节。

    3.2 数据库的操作

    语法:db.DatabaseName.Method。(MongoDB的命令末尾的分号可有可无。)
    • 显示所有数据库:show databases/dbs。
    • 显示当前数据库:db。
    • 切换数据库:use DatabaseName。
    • 创建数据库:db.DatabaseName.insert({“id’”: 1}); (切换到一个不能存在的数据库并插入数据,就可以自动创建一个数据库和一个集合。)
    • 删除数据库:db.dropDatabase(); 删除当前的数据库,这个函数没有参数。
    实操:

    show dbs;
    Community 0.000GB
    a 0.000GB
    admin 0.000GB
    ...(省略部分显示)
    db;
    test
    use info;
    switched to db info
    db.info.insert({"id":1});
    WriteResult({ "nInserted" : 1 })

    3.3 数据存在硬盘的位置

    安装时会提示数据的存放路径:E:Program FilesMongoDBServer4.0data。
    也可以连接MongoDB时指定路径,语法形式为:mongod --dbpath D:xx。
    表对应的是.wt格式的文件。

    4 MongoDB的表

    即collection。

    4.1 表的命名规则

    4.2 表的操作

    • 查看所有表:show tables或show collections;
    • 创建表:db.collection_name.insert(document); 对不存在的表插入数据,会自动创建表。
    • 删除表:db.collection_name.drop();
    实操:

    show tables;
    info
    db.info.drop();
    true
    show tables;
    (空)

    4.3 数据的操作

    插入数据:db.COLLECTION_NAME.insert(document); 使用insert或save函数进行插入。
    修改数据: 使用update或save函数进行数据的更新。
    db.COLLECTION_NAME.update(, ,
    { upsert: ,
    multi: ,
    writeConcern:
    });
    或db.COLLECTION_NAME.save(
    ,
    { writeConcern: } )
    删除数据:
    db.COLLECTION_NAME.remove(
    ,
    { justOne: ,
    writeConcern: } )
    实操:

    use info;
    switched to db info
    show tables;
    db.a.insert({"id":1, "name":"zhangsan"}); (对不存在的表a插入数据)
    WriteResult({ "nInserted" : 1 })
    db.a.find(); (查询数据)
    { "_id" : ObjectId("5dc4edd3d24f462347b9b0ed"), "id" : 1, "name" : "zhangsan" }

    data1={'addr':'guangzhou'};
    { "addr" : "guangzhou" }

    db.a.insert(data1); (使用变量插入数据)
    WriteResult({ "nInserted" : 1 })
    db.a.save({"id":3,"name":"lisi"}); (使用save方法插入数据)
    WriteResult({ "nInserted" : 1 })
    db.a.update({"id":1}, {"id":"001"}); (使用update方法插入数据)
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    db.a.update( { "id" : { $gt : 1 } } , { $set : { "id" : "OK"} } ); (使用update...set修改数据)
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    db.a.find();
    { "_id" : ObjectId("5dc4edd3d24f462347b9b0ed"), "id" : "001" }
    { "_id" : ObjectId("5dc4ee60d24f462347b9b0ee"), "addr" : "guangzhou" }
    { "_id" : ObjectId("5dc4ee8ad24f462347b9b0ef"), "id" : "OK", "name" : "lisi" }

    db.a.remove({"id":"OK"}); (使用remove方法删除数据)
    WriteResult({ "nRemoved" : 1 })
    db.a.find();
    { "_id" : ObjectId("5dc4edd3d24f462347b9b0ed"), "id" : "001" }
    { "_id" : ObjectId("5dc4ee60d24f462347b9b0ee"), "addr" : "guangzhou" }
    db.a.remove({});
    WriteResult({ "nRemoved" : 2 })
    db.a.find();
    (空)

    4.4 查询数据

    SQL的语法:select 字段from table where 条件 group by 字段 order by 字段;
    MongoDB的语法:db.collection_name.find({查询条件}, {查询结果返回的字段}).sort({排序字段});
    • 如果要以易读的方式来读取数据,加上 pretty函数:db.collection_name.find().pretty()
    • 如果只想要一条结果,使用findOne:db.collection_name.findOne()
    • 筛选:find函数的第一个参数。直接写在冒号后面:等于,(ne:不等于,)gt:大于,(lt:小于。 • and并:db.COLLECTION_NAME.find({key1:value1, key2:value2}); find函数的参数可以传入多个值,用逗号隔开,类似sql的and。 • or或: db.COLLECTION_NAME.find( {)or: [{key1: value1}, {key2:value2}] } ) 使用(or关键字来实现or。注意find的参数一个字典,字典的key)or对应的value是一个数组,数组的元素是多个字典。
    • 返回多少条记录:db.COLLECTION_NAME.find().limit(n) 类似mysql的limit。
    • 跳过多少条记录:db.COLLECTION_NAME.find().limit(n).skip(NUMBER) 使用skip跳过指定数量的记录。
    • 排序:db.COLLECTION_NAME.find().sort({KEY:1}) 使用sort方法排序,1表示升序,-1表示降序。
    实操:

    use info;
    switched to db info
    show tables;
    a
    db.a.find();
    db.a.insertMany([ {"id":1, "name":"zhangsan"}, {"id":2, "name":"lisi"}, {"id":
    3, "name":"wangwu"}, {"id":4, "name":"zhaoliu"}, {"id":5, "name":"sunqi"} ]);

    (注意,insert方法只能插入一条数据。插入多条数据使用insertMany,Many的M需要大写。

    多条数据用中括号括起来代表数组。)

    {
    "acknowledged" : true,
    "insertedIds" : [
    ObjectId("5dc4f3ded24f462347b9b0f8"),
    ObjectId("5dc4f3ded24f462347b9b0f9"),
    ObjectId("5dc4f3ded24f462347b9b0fa"),
    ObjectId("5dc4f3ded24f462347b9b0fb"),
    ObjectId("5dc4f3ded24f462347b9b0fc")
    ]
    }

    db.a.find();
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f9"), "id" : 2, "name" : "lisi" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : 5, "name" : "sunqi" }

    db.a.find({"id":{(gte:3} }); (大于等于) { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" } { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" } { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : 5, "name" : "sunqi" } db.a.find({"id":{)gte:3}, "name":"wangwu"}); (多条件and)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    db.a.find({(or: [{"id":{)gte:3}}, {"name":"zhangsan"}] }); (多条件or。注意写法。)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : 5, "name" : "sunqi" }

    db.a.find({(or: [{"id":{)gte:3}}, {"name":"zhangsan"}] }).limit(2); (limit限定返回记录数)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    db.a.find({(or: [{"id":{)gte:3}}, {"name":"zhangsan"}] }).limit(2).skip(1); skip限定跳过的记录)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    db.a.find({(or: [{"id":{)gte:3}}, {"name":"zhangsan"}] }).sort({"id":-1}); (sort排序)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : 5, "name" : "sunqi" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }

    db.a.update({"id":5}, {"id":"5","name":"sunqi"}); (修改数据类型)
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    db.a.find();
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f9"), "id" : 2, "name" : "lisi" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : "5", "name" : "sunqi" }
    db.a.find({"id":{(type:2}}); (使用)type操作符筛选符合类型的记录)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : "5", "name" : "sunqi" }

    5 分组聚合

    聚合(aggregate),把数据按字段分组,返回计算后的数据结果。类似SQL的count ... group by。
    语法:db.collection_name.aggregate(AGGREGATE_OPERATION)
    实操:

    db.a.insertMany([{"id":1, "name":"mike"}, {"id":2,"name":"jordon"}]); (插入数据)
    {
    "acknowledged" : true,
    "insertedIds" : [
    ObjectId("5dc505add24f462347b9b0fd"),
    ObjectId("5dc505add24f462347b9b0fe")
    ]
    }
    db.a.find(); (数据已经被添加)
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f8"), "id" : 1, "name" : "zhangsan" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0f9"), "id" : 2, "name" : "lisi" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fa"), "id" : 3, "name" : "wangwu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fb"), "id" : 4, "name" : "zhaoliu" }
    { "_id" : ObjectId("5dc4f3ded24f462347b9b0fc"), "id" : "5", "name" : "sunqi" }
    { "_id" : ObjectId("5dc505add24f462347b9b0fd"), "id" : 1, "name" : "mike" }
    { "_id" : ObjectId("5dc505add24f462347b9b0fe"), "id" : 2, "name" : "jordon" }
    db.a.aggregate([{(count:'id' }]); (类似SQL的count(*)) { "id" : 7 } db.a.aggregate([{)group:{_id:"(id", count:{)sum:1} } }]); (按id分组后计数.字段名要加(符号) { "_id" : "5", "count" : 1 } { "_id" : 3, "count" : 1 } { "_id" : 2, "count" : 2 } { "_id" : 1, "count" : 2 } { "_id" : 4, "count" : 1 } db.a.aggregate([{)group:{_id:"(id", max:{)max:"$id"} } }]); (按id分组后求最大值)
    { "_id" : "5", "max" : "5" }
    { "_id" : 3, "max" : 3 }
    { "_id" : 2, "max" : 2 }
    { "_id" : 1, "max" : 1 }
    { "_id" : 4, "max" : 4 }

    6 索引

    索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
    创建索引:db.COLLECTION_NAME.ensureIndex({KEY:1}, {parameters:value}) 使用ensureIndex函数创建索引。1表示升序创建索引,-1表示降序创建索引。
    实操:

    db.a.ensureIndex({"id":1}, {background:1}); (为id创建索引)
    {
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
    }

  • 相关阅读:
    java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?
    JDBC 关于大文本数据
    JDBC 关于Date格式
    JDBC 增删改查代码 过滤查询语句
    JavaBean与JSP
    配置tomcat映射jsp
    【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】
    【Xamarin挖墙脚系列:多窗口之间的导航】
    【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】
    【Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools】
  • 原文地址:https://www.cnblogs.com/qianxiaoruofeng/p/14150340.html
Copyright © 2011-2022 走看看