学习mongodb(一):mongodb基本用法

什么是MongoDB ?

  • MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
  • 在高负载的情况下,添加更多的节点,可以保证服务器性能。
  • MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
    在这里插入图片描述

主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

Mongodb语法

  • 创建数据库
    use DATABASE_NAME(如果数据库不存在,则创建数据库,否则切换到指定数据库,DATABASE_NAME为数据库名称)
  • 查看所有数据库
    show dbs
  • 创建集合
    db.createCollection(name, options)
    name: 要创建的集合名称
    options: 可选参数, 指定有关内存大小及索引的选项
    options 可以是如下参数
字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

实例:

db.createCollection(“mycollection”, { capped : true, autoIndexId : true, size :6142800, max : 10000})

MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合
db.mycollection.insert({“name” : “菜鸟教程”}),会自动创建mycol2集合

  • 查看已有集合
    show collections 或 show tables
  • 删除集合
    db.COLLECTION_NAME.drop()

db.mycollection.drop()

  • 插入文档
    db.COLLECTION_NAME.insert(document) (文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式)
  • 更新文档 update()
    db.COLLECTION_NAME.update(
    < query >,
    < update >,
    {
    upsert: < boolean >,
    multi: < boolean >,
    writeConcern: < document >
    }
    )

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

db.mycollection.update({‘title’:‘MongoDB 教程’},{$set:{‘title’:‘MongoDB’}},{multi:true})
只更新第一条记录:
db.mycollection.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );
全部更新:
db.mycollection.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );
只添加第一条:
db.mycollection.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );
全部添加进去:
db.mycollection.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );
全部更新:
db.mycollection.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );
只更新第一条记录:
db.mycollection.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );

  • 更新文档 save()
    db.COLLECTION_NAME.save(
    < document >,
    {
    writeConcern: < document >
    }
    )
    参数说明:
    document : 文档数据。
    writeConcern :可选,抛出异常的级别
    实例:

db.mycollection.save({
“_id” : ObjectId(“56064f89ade2f21f36b03136”),
“title” : “MongoDB”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “Runoob”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“NoSQL”
],
“likes” : 110
})

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

db.mycollection.remove({‘title’:‘MongoDB 教程’})

db.mycollection.remove({‘title’:‘MongoDB 教程’},1)

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

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
db.mycollection.find({key1:value1, key2:value2}).pretty()

db.col.find({“by”:“菜鸟教程”, “title”:“MongoDB 教程”}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}

OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{ $or: [ {key1: value1}, {key2:value2}]}
).pretty()

db.col.find({$or:[{“by”:“菜鸟教程”},{“title”: “MongoDB 教程”}]}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}

AND 和 OR 联合使用

db.col.find({“likes”: {$gt:50}, $or: [{“by”: “菜鸟教程”},{“title”: “MongoDB 教程”}]}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}

条件查询

操作格式范例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
  • 读取的记录条数 limit()
    db.COLLECTION_NAME.find().limit(NUMBER)

db.mycollection.find({},{“title”:1,_id:0}).limit(2)

skip方法同样接受一个数字参数作为跳过的记录条数db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

db.mycollection.find({},{“title”:1,_id:0}).limit(1).skip(1)

  • 排序 sort()
    db.COLLECTION_NAME.find().sort({KEY:1})
    1 为升序排列,而 -1 是用于降序排列

db.col.find({},{“title”:1,_id:0}).sort({“likes”:-1})

  • 索引
    db.COLLECTION_NAME.ensureIndex() (3.0以前的版本)
    db.COLLECTION_NAME.createIndex(keys, options)
    1 为指定按升序创建索引,降序来创建索引指定为 -1

db.col.createIndex({“title”:1})
db.col.createIndex({“title”:1,“description”:-1})

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

在后台创建索引

db.mycollection.createIndex({open: 1, close: 1}, {background: true})

  • 聚合
    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
表达式描述实例
$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 : { m a x : " max : " 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.article.aggregate( { $project : { title : 1 ,author : 1 ,}} );
显示_id, title, author字段
db.article.aggregate({ $project : { _id : 0 , title : 1 , author : 1 }});
不显示_id,显示title, author
db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
db.article.aggregate({ $skip : 5 });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值