Mongodb 的学习
传送门:
# 官方网站 及 下载地址
https://www.mongodb.com/download-center/enterprise/releases # 之前简单学习的笔记
http://www.cnblogs.com/CyLee/p/5886009.html # window 下推荐使用 scoop 来安装 mongoDB
scoop install mongodb
快速入门使用:
1、手动新建db文件夹,路径c:\data\db
2、进入mongodb/bin目录,或者将其加入到 Path 环境变量中,使用如下命令启动服务:
mongod --dbpath=c:\data\db
3、在 bin 目录下找到 mongo.exe 打开,即可开始 mongo 旅程
4、测试代码
# 显示所有数据库的名字
show dbs
配置进阶:
默认window下安装的Mongodb环境是没有配置文件的。我们可以自定义,将上述的dbpath、Port等信息统一管理。这是强烈推荐的做法
在任意一个地方新建 mongodb.conf 文件。放入如下信息:
# 数据库路径
dbpath=C:\data\db # 启用日志文件,默认启用
journal=true # 日志输出文件路径
logpath=C:\data\log # 错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
logappend=true # 这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true # 端口号 默认为27017
port=27017
启动方式:mongod --config ./mongodb.conf
一些概念补充、深坑记录、碎片化知识点:
1、Mongodb 中集合的概念非常重要,可以理解为关系型数据库中表的概念。这样理解是有利于我们学习的。
在传统的SQL数据库中,需要做的第一件事是创建一个真正的数据库;
不过,在MongoDB中并不需要这么做,因为它将在第一次存储数据时自动创建数据库和集合
1、创建数据库 library
use library
在MongoDB shell 中输入 db 即可查看当前正在使用的数据库
2、插入数据
/**
* @desc - 必须遵守的规则
* $字符不能是键名的第一个字符。 如$tag
* 圆点"."不能出现在键名中。 如ta.gs
* 尽量不要用_id作为键
* 空字符串不能作为键名
* 不要使用保留字符串作为集合名,如system, null 等敏感词汇
*/ # 先创建临时变量
document = ({
"Type": "Book",
"Title": "Mongodb从入门到入院",
"ISBN":"978-1-4302-5821-6",
"Publisher": "Aperss",
"Author":["Houws","Eelco","Membrey","Tim"]
})
# 然后再插入
db.media.insert( document )
# 也可以直接插入
db.media.insert({
"Type": "CD",
"Title": "Nevermind",
"Tracklist": [
{
"Track": "",
"Title": "Smells Like Teen Spirit",
"Length": "5: 02"
},
{
"Track": "",
"Title": "In Bloom",
"Length": "4:15"
}
]
}) # 多插入几条测试数据
db.media.insert({"Type":"CD", "Artist":"Nirvana", "Title":"Nevermind"})
3、查询数据
# 查看当前数据库的所有集合
show collections # 全查
media.find() # 查看数量
db.users.find().size() # 按条件查
db.media.find({"Artist": "Nirvana"}) # 按条件查指定字段,结果将按升序显示。升序排序将基于文档的插入顺序
db.media.find({"Artist": "Nirvana"}, {Title: 1}) # 使用点号查询,对于复杂的文档结构很常用
db.media.find({"Tracklist.Title":"In Bloom"}) # 数组查询并不需要补全。只需要其中一个即可
db.media.find({"Author":"Eelco"}) # sort()进行排序
db.media.find().sort({Title: 1}) # limit(10) 查询前10个
db.media.find().limit(10) # 跳过前20个
db.media.find().skip(20) # 使用findOne()来搜索单一数据,他的使用方式和find()一致
db.media.findOne({Type:"Book"})
固定集合、自然顺序和$natural
1、创建固定集合
固定集合和标准集合对比:
-大小固定,一旦集合超出设置的大小,最老的数据(栈头)将被删除,最新的数据将会加入到末端(栈尾)。保证了数据的顺序。
- 需要手动创建
- 集合的大小不能改变,除非删除重建
- 不仅可以设置大小,还可以设置文档的数量,文档数量的执行判断限制权限,要比判断大小高。
# 创建一个名为 audit 的固定集合,它的大小不能超过 20480 大小
db.createCollection("audit", {capped:true, size:}) # 创建一个名为 audit100 的固定集合, 文档数量不得超过 100 并且 它的大小不能超过 20480 大小
db.createCollection("audit100", {capped: true, size:20480, max:100}) # 固定集合倒序查询必须使用$natural
db.audit.find().sort({$natural: -1}).limit(10) # 查看集合
db.audit100.validate(true)
聚合命令
1、使用 count 返回文档数量
db.media.count() db.media.find({Type:"Book"}).count()
2、使用 distinct() 函数返回唯一值
db.media.distinct("Title")
3、使用 group(key, initial, reduce) 将结果分组
函数group()目前在分片环境中无法正常工作。 因此,在这种环境中应该使用mapreduce()
另外,在group()函数输出的结果中包含的健不能超过10000个,否则会抛出异常。这样的情况也可以通过apreduce()来处理
group()函数将接受3个参数:key、initial 和 reduce.
- key: 指定希望使用哪个键对结果进行分组。例如,希望通过Title 对结果进行分组。
- initial: 允许为每个已分组的结果提供基数(元素开始统计的起始基数)。
- reduce: 接受两个参数:正在遍历的当前文档 和 聚集计数对象。
4、大小比较
$gt:大于 $gte:大于等于 $lt:小于 $lte:小于等于
# 大于
db.media.find({Released: {$gt: } }) # 范围
db.media.find({Released: {$gte: 1990, $lt: 2010}})
5、$ne 除了指定条件以外的所有文档,下例中找出所有作者不是Eelco的图书
db.media.find({Type:"Book", Author: {$ne: "Eelco"}})
6、数组匹配 $in, 如果需要完全匹配,则使用$all
db.media.find({Released: {$in: [, , ]}})
还有$nin , 既查找不存在数组中的值,这里不演示了
7、多个表达式 $or
# 任意一个表达式满足
db.media.find({$or: [{Title: "Toy Story 3"}, {"ISBN": "987-1-4302-3051-9"}]}) # 必须先通过第一个表达式
db.media.find({Type:"DVD", $or: [{Title: "Toy Story 3"}, {ISBN: "987-1-4302-3051-9"}]})
8、使用$slice获取文档
操作符$slice结合了$limit() 和 $skip() 的功能。
# 取出前3个
db.media.find({Title: "Matrix, the"}, {Cast: {$slice: }}) # 取出最后3个
db.media.find({Title: "Matrix, the"}, {Cast: {$slice: -}}) # 从第三个开始,取出3个
db.media.find({Title: "Matrix, the"}, {Cast: {$slice: [, ]}}) # 忽略最后5个,限制输出4个
db.media.find({Title: "Matrix, the"}, {Cast: {$slice: [-, ]}})
9、探索求余 / 奇偶数
# 找出所有Released字段为偶数的文档
db.media.find({Released: {$mod: [2, 0]}}) # 找出所有Released字段为奇数的文档
db.media.find({Released: {$mod: [2, 0]}})
10、$size 通过过滤 数组长度 来搜索文档,如下例子,找出含两首歌曲的CD
db.media.find({Tracklist: {$size: 2}})
11、$exists 特定字段存在的情况下才返回文档, 如下例子,找出没有作者的CD
db.media.find({Author: {$exists: false}})
12、根据BSON类型来判断
# 找出Tracklist为内嵌类型(Object)的文档
db.media.find({Tracklist: {$type: 3}})
13、使用javascript语法查询。特色是非常灵活非常js,缺点是比源生慢一点
# 直接查询
db.media.find("this.Released < 1995") # 定义函数 + 使用函数查询
f = function () {return this.Released < 1995}
db.media.find(f)
更新数据
1、使用update()
它接受三个参数:1、查询条件 2、更新数据 3、可选项(upsert 和 multi)
upsert : 如果数据不存在则插入,如果存在就更新
multi: 默认只更新第一个文档。为true时更新所有文档
$set 操作符将某个字段设置为指定值
db.media.update({Title: "Matrix, the"}, {$set: {Type: "DVD", Title: "Matrix,The", Released: 1999, Genre: "Action"}},{upsert: true, multi: true})
也可以用 save() 来实现upsert() . 它的用法和uodate() 很相似,区别仅仅在于省略第三个可选项参数
db.media.update({Title: "Matrix, the"}, {Type: "DVD", Title: "Matrix,The", Released: 1999, Genre: "Action"})
2、使用 $inc 快速增值或者减值
db.media.update({Title: "Toy Story 3"}, {$inc: {Released: 4}}) db.media.update({Title: "Toy Story 3"}, {$inc: {Released: -4}})
3、删除字段
# 删除了 Released 字段
db.media.update({Title: "Toy Story 3"}, {$unset: {Released: 1}})
4、remove() 删除数据
# 删除所有数据
db.users.remove({}) # 按条件删除
db.documents.remove({"a": 1}) # 使用javascript删除
db.documents.remove("this.a < 4")
5、添加字段与值
db.media.update({Title: "Toy Story 3"}, {$push: {"Author": "Lee"}})
Mongodb 的学习的更多相关文章
- NoSQL之【MongoDB】学习(三):配置文件说明
摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...
- [转载]MongoDB开发学习(2)索引的基本操作
索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...
- 双刃剑MongoDB的学习和避坑
双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...
- MongoDB的学习--索引类型和属性(转)
原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...
- mongodb数据库学习【安装及简单增删改查】
//@desn:mongodb数据库学习 //@desn:码字不宜,转载请注明出处 //@author:张慧源 <turing_zhy@163.com> //@date:2018/08/ ...
- Mongodb数据库学习系列————(一)Mongodb数据库主从复制的搭建
Mongodb数据库主从复制的搭建 Writeby:lipeng date:2014-10-22 最近项目上用到了位置查询,在网上 ...
- mongodb入门学习小记
Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...
- MongoDB快速学习笔记
一,下载. XP系统,32位的下载地址: https://www.mongodb.org/dl/win32/i386 例:win32/mongodb-win32-i386-2.0.7.ziphttp: ...
- MongoDB的学习--文档的查询
继续关于<MongoDB权威指南>记录,今天的内容是文档的查询~~ MongoDB官网地址:http://www.mongodb.org/ 我使用的是MongoDB 2.4.8 find函 ...
- MongoDB入门学习(一)—— 安装和启动
最近由于工作需要,开始学习MongoDB数据库了.第一篇博文就从这里开始吧,以此记录下学习中的点点滴滴,为自己加油呢! (一) MongoDB简介 网上搜搜了一下:(来源:http://www.run ...
随机推荐
- javascript原型理解一种
http://www.jianshu.com/p/15ac7393bc1f 这个系列值得好好学习的.. // 声明构造函数 function Person(name, age) { this.name ...
- JquerySession使用
添加数据 $.session.set('key', 'value') 删除数据 $.session.remove('key'); 获取数据 $.session.get('key'); 清除数据 $.s ...
- HDU 1171.Big Event in HDU-动态规划0-1背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 【poj1149】 pigs 网络流最大流问题
描述 Description 尼克在一家养猪场工作,这家养猪场共有M间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍,客户们从早上开始一个接一个来购买生猪,他们到达后首先用手中的 ...
- elasticsearch 分布式部署
修改配置文件 /config/elasticsearch.yml 我用两台机器,内网地址分别为230 和 231 处理启动报错一: [2017-01-12T15:55:55,433][INFO ][o ...
- JAVA常见算法题(一)
package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...
- 深度学习和web安全最新文章一览
先囤几篇文章: 1.https://www.cdxy.me/?p=773 2.https://segmentfault.com/a/1190000009052376 3.https://segment ...
- ES6里关于字符串的拓展
一.子串识别 自从 JS 引入了 indexOf() 方法,开发者们就使用它来识别字符串是否存在于其它字符串中.ES6 包含了以下三个方法来满足这类需求: 1.includes():该方法在给定文本存 ...
- ambari journalnode异常Can't scan a pre-transactional edit log
今天在删日志文件,不知道删错哪个地方了. 该目录下一直报错,这个日志文件增长很快, /var/log/hadoop/hdfs/ hadoop-hdfs-journalnode-xx.log 先备份/h ...
- ssh免密码登录之分发密钥
ssh免密码登录之分发密钥 1.ssh免密码登录 密码登录和密钥登录有什么不同? 密码登录(口令登录),每次登录都需要发送密码(ssh) 密钥登录,分为公钥和私钥,公钥相当于锁,私钥相当于钥匙 1.1 ...