MongoDB入门

Posted 饱腹百科

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB入门相关的知识,希望对你有一定的参考价值。

MongoDB简介

MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案;MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

具有下面的特点:

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

MongoDB基本概念

SQL概念MongoDB概念说明
databasedatabasedatabase
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键
  • 数据库

一个mongodb中可以建立多个数据库,MongoDB的默认数据库为"db",该数据库存储在data目录中,MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中,“show dbs” 命令可以显示所有数据的列表。

// 展示所有数据库
show dbs

// 运行"use"命令,可以连接到一个指定的数据库。
use local

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库

admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。

config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

  • 集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

集合需要注意的点:

1、集合名不能是空字符串""。

2、集合名不能含有\\0字符(空字符),这个字符表示集合名的结尾。

3、集合名不能以"system."开头,这是为系统集合保留的前缀。

4、用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

  • 文档

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

不过需要注意的是:

1、文档中的键/值对是有序的。

2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

3、MongoDB区分类型和大小写。

4、MongoDB的文档不能有重复的键。

5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

元数据

数据库的信息是存储在集合中。它们使用了系统的命名空间:

集合命名空间描述
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)元素的最低值和最高值相对比
Array用于将数组或列表或多个值存储为一个键
Timestamp时间戳。记录文档修改或添加的具体时间
Object用于内嵌文档
Null用于创建空值
Symbol符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言
Date日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息
Object ID对象 ID。用于创建文档的 ID
Binary Data二进制数据。用于存储二进制数据
Code代码类型。用于在文档中存储 javascript 代码
Regular expression正则表达式类型。用于存储正则表达式

MongoDB连接

1、MongoDB 安装目录的 bin 目录下执行 mongodb 即可。

2、连接格式:mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]

3、连接到指定数据库:mongodb://admin:123456@localhost/test

MongoDB复制(副本集)

MongoDB复制是将数据同步在多个服务器的过程,复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性,复制还允许您从硬件故障和服务中断中恢复数据。

  • 复制原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据,mongodb各个节点常见的搭配方式为:一主一从、一主多从。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

  • 副本集特征

1、N 个节点的集群

2、任何节点可作为主节点

3、所有写入操作都在主节点上

4、自动故障转移

5、自动恢复

MongoDB分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求,当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

  • 使用分片的优点

1、复制所有的写入操作到主节点

2、延迟的敏感数据会在主节点查询

3、单个副本集限制在12个节点

4、当请求量巨大时会出现内存不足。

5、本地磁盘不足

6、垂直扩展价格昂贵

  • 分片架构组成

Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

Config Server:mongodb实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

mongodb 入门

// 登录
D:\mongodb>D:\mongodb\mongodb206\mongodb206\bin\mongo 127.0.0.1:27017/admin
MongoDB shell version: 2.0.6
connecting to: 127.0.0.1:27017/admin
//在缓存中创建一个数据库 
> use foobar
switched to db foobar
> db.persons.insert(name:"tomcat")
//插入数据后数据库会真正创建
Sat Jun 03 15:22:26 SyntaxError: missing ) after argument list (shell):1
> db.persons.insert((name:"tomcat"))
Sat Jun 03 15:22:41 SyntaxError: missing ) in parenthetical (shell):1
> db.persons.insert({name:"tomcat"})
> show dbs;
//显示所有的数据
foobar  0.03125GB
local   (empty)//默认建立的
> show collections //显示数据库下面的表
persons
system.indexes
> db.system.indexes.fin()
Sat Jun 03 15:24:23 TypeError: db.system.indexes.fin is not a function (shell):1

> db.system.indexes.find(); //查询语句
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "foobar.persons", "name" : "_id_" }
> db.foobar.find();
> db.person.find();
> db.persons.find();//查询所有
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat" }
> db.persons.findone(); //查询第一条
Sat Jun 03 15:27:20 TypeError: db.persons.findone is not a function (shell):1
> db.persons.insert({name:"extjs"})//新增数据
> db.persons.find();
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat" }
{ "_id" : ObjectId("593264f2622897d4e7c9b221"), "name" : "extjs" }
//更新数据,第一个参数是选择器,第二个是要更新的数据
> db.persons.update({name:"extjs"},{$set:{name:"extjs4.0"}});

> db.persons.find();
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat" }
{ "_id" : ObjectId("593264f2622897d4e7c9b221"), "name" : "extjs4.0" }
> var p  = db.persons.findOne(); //定义变量
> p //查看
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat" }
> db.persons.update(p,{$set:{name:"tomcat8"}});
> db.persons.find(); //查找
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat8" }
{ "_id" : ObjectId("593264f2622897d4e7c9b221"), "name" : "extjs4.0" }
> p
{ "_id" : ObjectId("593263d9622897d4e7c9b220"), "name" : "tomcat" }
> var p  = db.persons.findOne();
> db.persons.update(p,{$set:{name:"tomcat8",age=1}});
Sat Jun 03 15:40:08 SyntaxError: missing : after property id (shell):1
> db.persons.update(p,{$set:{name:"tomcat8",age="1"}});
Sat Jun 03 15:40:22 SyntaxError: missing : after property id (shell):1
> db.persons.update(p,{$set:{name:"tomcat8",age:"1"}});
//删除操作表
> db.persons.remove({age:"1"})
> db.persons.find()
{ "_id" : ObjectId("593264f2622897d4e7c9b221"), "name" : "extjs4.0" }
> show collections
persons
system.indexes
//删除当前数据库
> db.dropDatabases()
Sat Jun 03 15:47:16 TypeError: db.dropDatabases is not a function (shell):1
> show dbs //显示所有的数据库
foobar  0.03125GB
local   (empty)
> db.dropDatabase()
{ "dropped" : "foobar", "ok" : 1 }
> show  dbs;
local   (empty)
> use foobar
switched to db foobar
> db.persons.insert({age:1,name:"tom",gender:"1"})
> db.persons.find();
{ "_id" : ObjectId("593269f2622897d4e7c9b222"), "age" : 1, "name" : "tom", "gend
er" : "1" }
> show dbs;
foobar  0.03125GB
local   (empty)
> show collections;
persons
system.indexes
> db.help() //帮助
DB methods:
        db.addUser(username, password[, readOnly=false])
        db.auth(username, password)
        db.cloneDatabase(fromhost)
        db.commandHelp(name) returns the help for the command
        db.copyDatabase(fromdb, todb, fromhost)
        db.createCollection(name, { size : ..., capped : ..., max : ... } )
        db.currentOp() displays the current operation in the db
        db.dropDatabase()
        db.eval(func, args) run code server-side
        db.getCollection(cname) same as db[cname] or db.cname
        db.getCollectionNames()
        db.getLastError() - just returns the err msg string
        db.getLastErrorObj() - return full status object
        db.getMongo() get the server connection object
        db.getMongo().setSlaveOk() allow this connection to read from the nonmas
ter member of a replica pair
        db.getName()
        db.getPrevError()
        db.getProfilingLevel() - deprecated
        db.getProfilingStatus() - returns if profiling is on and slow threshold

        db.getReplicationInfo()
        db.getSiblingDB(name) get the db at the same server as this one
        db.isMaster() check replica primary status
        db.killOp(opid) kills the current operation in the db
        db.listCommands() lists all the db commands
        db.logout()
        db.printCollectionStats()
        db.printReplicationInfo()
        db.printSlaveReplicationInfo()
        db.printShardingStatus()
        db.removeUser(username)
        db.repairDatabase()
        db.resetError()
        db.runCommand(cmdObj) run a database command.  if cmdObj is a string, tu
rns it into { cmdObj : 1 }
        db.serverStatus()
        db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all
        db.shutdownServer()
        db.stats()
        db.version() current version of the server
        db.getMongo().setSlaveOk() allow queries on a replication slave server
        db.fsyncLock() flush data to disk and lock server for backups
        db.fsyncUnock() unlocks server following a db.fsyncLock()
> db.dbgetName()
Sat Jun 03 16:03:03 TypeError: db.dbgetName is not a function (shell):1
> db.dbgetName()
Sat Jun 03 16:03:11 TypeError: db.dbgetName is not a function (shell):1
> db.getName()//获取当前是数据库名字
foobar
> db.getstatus
foobar.getstatus
> db.status()
Sat Jun 03 16:03:39 TypeError: db.status is not a function (shell):1
> db.stats()  //获取当前数据库的信息
{
        "db" : "foobar",
        "collections" : 3,
        "objects" : 5,
        "avgObjSize" : 48.8,
        "dataSize" : 244,
        "storageSize" : 12288,
        "numExtents" : 3,
        "indexes" : 1,
        "indexSize" : 8176,
        "fileSize" : 16777216,
        "nsSizeMB" : 16,
        "ok" : 1
}
> db.persons.count() 
1
> db.person.help();//帮助
DBCollection help
        db.person.find().help() - show DBCursor help
        db.person.count()
        db.person.dataSize()
        db.person.distinct( key ) - eg. db.person.distinct( x )
        db.person.drop() drop the collection
        db.person.dropIndex(name)
        db.person.dropIndexes()
        db.person.ensureIndex(keypattern[,options]) - options is an object with
these possible fields: name, unique, dropDups
        db.person.reIndex()
        db.person.find([query],[fields]) - query is an optional query filter. fi
elds is optional set of fields to return.
                                                      e.g. db.person.find( {x:77
} , {name:1, x:1} )
        db.person.find(...).count()
        db.person.find(...).limit(n)
        db.person.find(...).skip(n)
        db.person.find(...).sort(...)
        db.person.findOne([query])
        db.person.findAndModify( { update : ... , remove : bool [, query: {}, so
rt: {}, new: false] } )
        db.person.getDB() get DB object associated with collection
        db.person.getIndexes()
        db.person.group( { key : ..., initial: ..., reduce : ...[, cond: ...] }
)
        db.person.mapReduce( mapFunction , reduceFunction , <optional params> )
        db.person.remove(query)
        db.person.renameCollection( newName , <dropTarget> ) renames the collect
ion.
        db.person.runCommand( name , <options> ) runs a db command with the give
n name where the first param is the collection name
        db.person.save(obj)
        db.person.stats()
        db.person.storageSize() - includes free space allocated to this collecti
on
        db.person.totalIndexSize() - size in bytes of all the indexes
        db.person.totalSize() - storage allocated for all data and indexes
        db.person.update(query, object[, upsert_bool, multi_bool])
        db.person.validate( <full> ) - SLOW
        db.person.getShardVersion() - only for use with sharding
        db.person.getShardDistribution() - prints statistics about data distribu
tion in the cluster
定义一个函数,函数的功能是插入数据
> function insert3(o){ db.getCollection("persons").insert(o);
... }
> insert3({name:"kitty"})
> db.persons.find();
{ "_id" : ObjectId("593269f2622897d4e7c9b222"), "age" : 1, "name" : "tom", "gend
er" : "1" }
{ "_id" : ObjectId("5932733d622897d4e7c9b227"), "name" : "kitty" }
>
//将参数中的字符串当做js代码处理

> db.eval(‘return "hello mongodb "‘);
hello mongodb

> for (var i = 0; i<10 ;i++){ db.persons.insert({name:i})
... }
> db.persons.find()
{ "_id" : ObjectId("593269f2622897d4e7c9b222"), "age" : 1, "name" : "tom", "gend
er" : "1" }
{ "_id" : ObjectId("5932733d622897d4e7c9b227"), "name" : "kitty" }
{ "_id" : "0001", "name" : "yarn" }
{ "_id" : ObjectId("59327d6e622897d4e7c9b228"), "name" : 0 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b229"), "name" : 1 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22a"), "name" : 2 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22b"), "name" : 3 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22c"), "name" : 4 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22d"), "name" : 5 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22e"), "name" : 6 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b22f"), "name" : 7 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b230"), "name" : 8 }
{ "_id" : ObjectId("59327d6e622897d4e7c9b231"), "name" : 9 }

save和insert的区别,save会变成更新语句并保存,insert则会报错

删除所有,但是索引不会删除
> db.persons.remove() > db.persons.find()

> db.persons.update({_id:"02"}, {_id:"02",name:"x0023"},true);//insert or update
> db.persons.find()
{ "_id" : "01", "name" : "01" }
{ "_id" : "02", "name" : "x0023" }
{ "_id" : "03", "name" : "x03" }

 

批量新增 在shell中是通过循环实现的,

更新时,只会更新满足条件的第一条数据

批量更新

> db.persons.update({name:"x03"}, {$set:{name:"x03sd"}},false,true);//批量更新
> db.persons.find()
{ "_id" : "01", "name" : "01" }
{ "_id" : "02", "name" : "x03sd" }
{ "_id" : "03", "name" : "x03sd" }
>

 













以上是关于MongoDB入门的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB入门

mongoDB入门

NoSQL系列专题:MongoDB快速入门

数据库MongoDB入门笔记:NoSQL,非关系型数据库简介

java架构之数据库MongoDB4.0入门到实践掌握NoSQL数据库企业主流解决方案

MongoDB入门详解