mongodb
MongoDB Atlas Database | Multi-Cloud Database Service | MongoDB
mongodb compass
mongodb默认端口27017
mongodb v2.4.9 快速操作记录
参考链接:runoob mongodb 教程
快速开启mongoDB控制台实例
首先进入到包含有mongodb 运行程序的bin目录,或者mongodb的路径已经加入全局的path变量
默认在D盘根目录创建一个data文件夹,里面再创建一个db
文件夹和log
文件夹
对于控制台的关闭,直接关闭cmd窗口即可,或者按ctrl+c
然后根据提示输入y
关闭
在下面windows服务部分的通过配置文件来运行同样适用于cmd控制台实例,只需要执行mongod --config your-config-path
fast-cmd-run.bat
@echo off
if not exist D:\data\db (md D:\data\db) else (echo Folder 'db' is exist)
if not exist D:\data\log (md D:\data\log) else (echo Folder 'log' is exist)
mongod.exe --dbpath D:\data\db --rest --bind_ip localhost --port 27017
以上用于D盘根目录创建一个data文件夹,里面再创建一个db
文件夹和log
文件夹,并绑定ip为localhsot,同时开启restFul API
fast-cmd-run-with-log.bat
@echo off
if not exist D:\data\db (md D:\data\db) else (echo Folder 'db' is exist)
if not exist D:\data\log (md D:\data\log) else (echo Folder 'log' is exist)
mongod.exe --dbpath D:\data\db --rest --bind_ip localhost --port 27017 --logpath D:\data\log\db.log --logappend
上面为日志版,任何内容都会输出到日志,而不是控制台
把mongoDB实例启动为windows系统服务
脚本最好使用管理员权限的命令行窗口执行,避免无权限的情况
如果把mongodb配置为windows服务,则必须带有日志,
同时dbpath和logpath必须为绝对路径,相对路径服务启动不了
fast-server-create.bat
@echo off
if not exist D:\data\db (md D:\data\db) else (echo Folder 'db' is exist)
if not exist D:\data\log (md D:\data\log) else (echo Folder 'log' is exist)
mongod.exe --rest --bind_ip localhost --port 27017 --serviceName "MongoDBService" --serviceDisplayName "MongoDB Service For IceDog" --serviceDescription "this is a mongo database service" --install --logpath D:\data\log\db.log --logappend --dbpath D:\data\db
net start MongoDBService
创建服务脚本只需要执行一次,同时可以改为通过把大部分配置放置到config配置文件中来简化命令行
icedog-mongod.config
rest=true
bind_ip=localhost
port=27017
logpath=D:\data\log\db.log
logappend=true
dbpath=D:\data\db
if not exist D:\data\db (md D:\data\db) else (echo Folder 'db' is exist)
if not exist D:\data\log (md D:\data\log) else (echo Folder 'log' is exist)
mongod --config D:\data\config\icedog-mongod.config --serviceName "MongoDBService" --serviceDisplayName "MongoDB Service For IceDog" --serviceDescription "this is a mongo database service" --install
net start MongoDBService
v2.4.x版本还可以通过config文件来配置创建mongodb服务,如上所示,配置文件说明地址:https://docs.mongodb.com/v2.4/reference/configuration-options/,3.0版本的配置文件采用YAML
语法编写配置文件,但向后兼容。
fast-server-delete.bat
@echo off
mongod --remove --serviceName "MongoDBService"
@echo off
net stop MongoDBService
sc delete MongoDBService
优先使用mongodb提供的api来移除服务
如果没有停止服务,直接删除则会出错,则可以先通过按ctrl+shift+esc
调出任务管理器,然后找到mongod.exe
并关掉,然后再执行sc delete MongoDBService
,如果仍然不行,则找到系统注册表,删掉服务的注册表信息,通常路径在:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
找到你的Service服务的名字,然后把整个文件夹删掉,还不行,参考这篇文章。
fast-server-start.bat
@echo off
net start MongoDBService
@echo off
sc start MongoDBService
两个命令都可以进行同样的操作
fast-server-stop.bat
@echo off
net stop MongoDBService
@echo off
sc stop MongoDBService
两个命令都可以进行同样的操作
下表为mongodb启动的参数说明:
参数 | 描述 |
---|---|
--bind_ip | 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP |
--logpath | 定MongoDB日志文件,注意是指定文件不是目录 |
--logappend | 使用追加的方式写日志 |
--dbpath | 指定数据库路径 |
--port | 指定服务端口号,默认端口27017 |
--serviceName | 指定服务名称 |
--serviceDisplayName | 指定服务名称,有多个mongodb服务时执行。 |
--install | 指定作为一个Windows服务安装。 |
客户端
mongo.exe
MongoVue
mongo shell
如果配置的是localhost:27017
执行mongo 就可以开始操作了,否则需要如下填写具体ip和端口
mongo localhost:46001
特殊数据库
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
常用指令
数据库相关指令
显示当前实例的所有数据库名
show dbs
显示当前数据库名
db
通过数据库名切换数据库
use dbname
创建数据库(以下例子都以icedog为数据库名)
//在icedog名称下的集合init中插入一条数据,这样数据库就可以在show dbs 中显示
use icedog
db.init.insert({key:'description',value:'init database'})
show dbs
删除数据库
show dbs
use icedog
db.dropDatabase()
show dbs
集合(表)相关指令
mongodb元数据(暂时不知为何无法使用)
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含数据库概要(profile)信息。 |
dbname.system.users | 列出所有可访问数据库的用户。 |
dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
显示当前数据库所有集合
show tables
创建普通集合
//插入一条数据之后就存在集合init
db.init.insert({key:'description',value:'create collection init'})
show tables
创建capped collection
db.createCollection("cappedCollection", {capped:true, size:100000})
show tables
删除集合
db.init.drop()
show tables
文档(记录行)相关指令
向集合插入文档
插入数据的方式和使用javascript函数是一样的方式,
插入文档也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
db.dog.insert({id:'d001',name:'robin',age:2,hairColor:'white',sex:'male',owner:{id:'o001',name:'johh',age:15,sex:'male'}});
db.dog.insert({id:'d002',name:'black',age:4,hairColor:'black',sex:'female',owner:{id:'o002',name:'tony',age:18,sex:'male'}});
var data1={id:'d003',name:'tom',age:2,hairColor:'white',sex:'male',owner:{id:'o003',name:'white',age:17,sex:'female'}};
db.dog.insert(data1);
data2 = ({id:'d004',name:'brook',age:3,hairColor:'white',sex:'female',owner:{id:'o004',name:'cook',age:15,sex:'male'}});
db.dog.insert(data2);
db.dog.save({id:'d005',name:'jim',age:1,hairColor:'white',sex:'male',owner:{id:'o005',name:'green',age:19,sex:'female'}});
var data3=[
{id:'d006',name:'ted',age:2,hairColor:'white',sex:'male',owner:{id:'o006',name:'monkey',age:15,sex:'male'}},
{id:'d007',name:'light',age:4,hairColor:'white',sex:'male',owner:{id:'o007',name:'sammy',age:15,sex:'male'}}];
db.dog.insert(data3);
db.dog.find();
查询集合中的文档
db.dog.find();
//格式化的形式
db.dog.find().pretty();
db.dog.find({id:'d001'}).pretty();
//返回多个文档
db.dog.find({age:2});
//返回一个文档
db.dog.findOne({age:2});
//返回对象过滤掉某些字段
//true,显示,false,隐藏,使用0 1 表示显示隐藏也可以,非0为true
db.dog.find({},{name:true,age:true});
//<
db.dog.find({age:{$lt:2}});
//<=
db.dog.find({age:{$lte:2}});
//>
db.dog.find({age:{$gt:2}});
//>=
db.dog.find({age:{$gte:2}});
//!=
db.dog.find({age:{$ne:2}});
// and
db.dog.find({age:{$ne:2},hairColor:'black'});
// or
db.dog.find({$or:[{age:{$ne:2}},{hairColor:'black'}]});
// and or
db.dog.find({sex:'female',$or:[{age:{$ne:2}},{hairColor:'black'}]});
//$type DoubleType:1,StringType:2,ObjectType:3,ArrayType:4,...
//更多参见http://www.runoob.com/mongodb/mongodb-operators-type.html
db.dog.find({"name" : {$type : 2}});
//top 3
db.dog.find().limit(3);
//skip(mongodb中才有,常规sql中需要进行子查询)
db.dog.find().skip(3);
//sort 1:asc, -1:desc
db.dog.find({},{name:true,age:true}).sort({age:1});
db.dog.find({},{name:true,age:true}).sort({age:-1});
更新集合中的文档
详细的信息请参考这里
db.collection.update() 方法
//此处更新id为d001的数据
db.dog.find({id:'d001'}).pretty();
//更新符合条件的第一个文档
db.dog.update({id:'d001'},{$set:{name:'new name'}});
//更新所有符合条件的文档
db.dog.update({id:'d001'},{$set:{name:'new name'}},{multi:true});
//如果不存在则插入此条记录
db.dog.update({id:'d100'},{$set:{name:'new name'}},{upsert:true});
db.dog.find({id:'d001'}).pretty();
db.collection.save() 方法
传入新文档来替换_id
字段相同的文档
db.dog.find({id:'d100'}).pretty();
db.dog.save({
"_id" : ObjectId("5a93837b792422f90745d707"),
"id" : "d100",
"name" : "new name by save"
})
删除集合中的文档
db.dog.remove({id:'d100'})
db.dog.find({id:'d100'}).pretty();
//删除所有(类似常规 SQL 的 truncate 命令)
db.dog.remove()
db.dog.find();
MongoDB 索引
ensureIndex() 方法
//详情参见:http://www.runoob.com/mongodb/mongodb-indexing.html
//1:asc, -1:desc
db.dog.ensureIndex({id:1});
//复合索引
db.dog.ensureIndex({id:1,name:1});
//后台创建索引
db.dog.ensureIndex({id:1,name:1},{background:true});
MongoDB 聚合
db.dog.aggregate([
{
$group:{
sex:{$sex:1},
totalAge:{
$sum:1
}
}
}
])
last index:http://www.runoob.com/mongodb/mongodb-aggregate.html
MongoDB 概念解析
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。 下表将帮助您更容易理解Mongo中的一些概念: |
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|---|
database | database | 数据库 | |
table | collection | 数据库表/集合 | |
row | document | 数据记录行/文档 | |
column | field | 数据字段/域 | |
index | index | 索引 | |
table | joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到+ 这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。
要注意的是指定的存储大小包含了数据库的头信息。
db.createCollection("mycoll", {capped:true, size:100000})
- 在capped collection中,你能添加新的对象。
- 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
- 数据库不允许进行删除。使用drop()方法删除collection所有的行。
注意: 删除之后,你必须显式的重新创建这个collection。 - 在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。
元数据
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含数据库概要(profile)信息。 |
dbname.system.users | 列出所有可访问数据库的用户。 |
dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
MongoDB 数据类型
数据类型 | 描述 | |
---|---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 | |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 | |
Boolean | 布尔值。用于存储布尔值(真/假)。 | |
Double | 双精度浮点值。用于存储浮点值。 | |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 | |
Arrays | 用于将数组或列表或多个值存储为一个键。 | |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 | |
Object | 用于内嵌文档。 | |
Null | 用于创建空值。 | |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用 | 于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 | |
Object ID | 对象 ID。用于创建文档的 ID。 | |
Binary Data | 二进制数据。用于存储二进制数据。 | |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 | |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
MongoDB连接命令格式
使用用户名和密码连接到MongoDB服务器,你必须使用 'username:password@hostname/dbname' 格式,'username'为用户名,'password' 为密码。
参数选项说明
标准格式:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
标准的连接格式包含了多个选项(options),如下所示: | 选项 | 描述 |
---|---|---|
replicaSet=name | 验证replica set的名称。 Impliesconnect=replicaSet. | |
slaveOk=true|false | true:在connect=direct模式下,驱动会连接第一台机器,即使这台服务器不是主。在connect=replicaSet模式下,驱动会发送所有的写请求到主并且把读取操作分布在其他从服务器。 false: 在 connect=direct模式下,驱动会自动找寻主服务器. 在connect=replicaSet 模式下,驱动仅仅连接主服务器,并且所有的读写命令都连接到主服务器。 |
|
safe=true|false | true: 在执行更新操作之后,驱动都会发送getLastError命令来确保更新成功。(还要参考 wtimeoutMS). false: 在每次更新之后,驱动不会发送getLastError来确保更新成功。 |
|
w=n | 驱动添加 { w : n } 到getLastError命令. 应用于safe=true。 | |
wtimeoutMS=ms | 驱动添加 { wtimeout : ms } 到 getlasterror 命令. 应用于 safe=true. | |
fsync=true|false | true: 驱动添加 { fsync : true } 到 getlasterror 命令.应用于 safe=true. false: 驱动不会添加到getLastError命令中。 |
|
journal=true|false | 如果设置为 true, 同步到 journal (在提交到数据库前写入到实体中). 应用于 safe=true | |
connectTimeoutMS=ms | 可以打开连接的时间。 | |
socketTimeoutMS=ms | 发送和接受sockets的时间。 |
MongoDB 与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询: | 操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|---|
等于 | { |
db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' | |
小于 | { |
db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 | |
小于或等于 | { |
db.col.find({"likes":{\$lte:50}}).pretty() | where likes <= 50 | |
大于 | { |
db.col.find({"likes":{\$gt:50}}).pretty() | where likes > 50 | |
大于或等于 | { |
db.col.find({"likes":{\$gte:50}}).pretty() | where likes >= 50 | |
不等于 | { |
db.col.find({"likes":{\$ne:50}}).pretty() | where likes != 50 |
MongoDB 中可以使用的类型如下表
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
发表评论