MongoDB 初体验
什么是MongoDB?
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是基于分布式文件存储的数据库,由C++语言编写。MongoDB是一个高性能,开源,无模式的文档型数据库。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。有非常强大的查询功能,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。
MongoDB的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事务支持较弱,不适用复杂的多文档(多表)的级联查询,速度比传统数据库的快百倍。文中演示MongoDB版本为3.4,Windows10 环境下。
安装
安装略。
运行
创建数据目录
MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C: 或者 D: 等 )。
在本教程中,我们已经在 D 盘安装了 mongodb,现在让我们创建一个 data 的目录然后在 data 目录里创建 db 目录。
d:\>cd d:\
d:\>mkdir data
d:\>cd data
d:\data>mkdir db
d:\data>cd db
d:\data\db>
命令行下运行 MongoDB 服务器
d:\env\MongoDB\Server\3.4\bin\mongod --dbpath d:\data\db
ps:d:envMongoDBServer3.4bin 是我的安装路径
启动MongoDB
要启动 MongoDB,请运行 mongod.exe 。
例如,从命令提示符:
D:\env\MongoDB\Server\3.4\bin\mongod.exe"
配置 MongoDB 服务
管理员模式打开命令行窗口
创建目录,执行下面的语句来创建数据库和日志文件的目录
mkdir d:\data\db
mkdir d:\data\log
创建配置文件
创建一个配置文件。该文件必须设置 systemLog.path 参数,包括一些附加的配置选项更好。
例如,创建一个配置文件位于 D:envMongoDBmongod.cfg,其中指定 systemLog.path 和 storage.dbPath。具体配置内容如下:
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
安装 MongoDB服务
通过执行mongod.exe
,使用--install
选项来安装服务,使用--config
选项来指定之前创建的配置文件。
"D:\env\MongoDB\Server\3.4\bin\mongod.exe" --config "D:\env\MongoDB\mongod.cfg" --install
要使用备用 dbpath
,可以在配置文件(例如:D:\env\MongoDB\mongod.cfg
)或命令行中通过 --dbpath
选项指定。
如果需要,您可以安装 mongod.exe
或 mongos.exe
的多个实例的服务。只需要通过使用 --serviceName
和 --serviceDisplayName
指定不同的实例名。只有当存在足够的系统资源和系统的设计需要这么做。
启动MongoDB服务
net start MongoDB
关闭MongoDB服务
net stop MongoDB
移除MongoDB服务
"D:\env\MongoDB\Server\3.4\bin\mongod.exe" --remove
命令行下运行 MongoDB 服务器 和 配置 MongoDB 服务 任选一个方式启动就可以。
MongoDB 后台管理 Shell
如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):
> mongo
MongoDB shell version: 3.0.6
connecting to: test
……
由于它是一个JavaScript shell,您可以运行一些简单的算术运算:
> 2 + 2
4
>
db 命令用于查看当前操作的文档(数据库):
> db
test
>
常用命令
数据库
1.显示数据库列表:
>show dbs
2.显示当前数据库中的集合(类似关系数据库中的表):
>show collections
3.显示当前数据库中用户:
>show users
4.切换当前数据库,这和MS-SQL里面的意思一样,如果没有该数据库,则直接创建。
>use <db name>
新创建的数据库使用show dbs
后是不会显示出来的,要显示数据库,需要至少插入一个文档。
db.items.insert({"name":"flicker"})
5.显示当前所在数据库
>db
6.删除当前所在的数据库
>db.dropDatabase()
集合
1.创建一个名为notemi的集合
>db.createCollection("notemi")
在 MongoDB
中,不需要创建集合。当插入一些文档时,MongoDB
也会自动创建集合。
>db.flicker.insert({"name" : "flicker"})
>show flicker
notemi
flicker
>
2.查看该库中所有的集合
>show collections
3.删除该库中名为notemi的集合
>db.notemi.drop()
文档
1.插入文档:
>db.COLLECTION_NAME.insert(document)
>db.mycol.insert({
_id: 100,
title: '标题',
description: '描述',
by: 'Flicker',
url: 'http://notemi.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
})
2.将单个文档插入到集合中:
>db.collection.insertOne()
>db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
3.将多个文档插入到集合中:
db.collection.insertMany()
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
4.将以非结构化的方式显示所有文档
>db.COLLECTION_NAME.find(document)
5.以格式化的方式显示结果
>db.mycol.find().pretty()
一些查询语句:
MongoDB中的AND操作符:
在find()方法中,如果通过使用","将它们分开传递多个键,则 MongoDB
将其视为AND
条件。
>db.mycol.find(
{
$and: [
{key1: value1}, {key2:value2}
]
}
).pretty()
在要根据OR
条件查询文档,需要使用$or
关键字。
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
6.更新操作
>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New Update MongoDB Overview'}})
7.删除文档
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
>db.mycol.find({}, {'_id':1, 'title':1})
MongoDB还有很多高级特性,在以后的文章中再来慢慢讲吧。