MongoDB基础理念及操作初探
MongoDB是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式基础概念:
NoSQL
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL的特点:
·分关系型
·分布式
·不提供ACID功能
本身常用技术特点:
·数据模型非常简单(每个记录只有单独的键
·元数据和应用数据分离
·弱一致性
其优势:
·避免不必要的复杂
对于web应用来讲,有些一致性有些多余,所以最适用于web2.0的应用场景
·高吞吐量
·高 水平扩展和低端硬件集群
·不使用关系型映射(所以使用的模型非常简单)
其劣势:
·不支持ACID (不能支持事物,但通常生产环境都是两种数据库结合)
·功能过于简单
·没有统一的数据查询模型
NoSQL数据库类别:
·键值存储
·列式数据库
·文档数据库
每一行都相当于独立的文件
·图式数据库
存放的为图,有着复杂对象关系的视图,比如在社交网站存储每个用户之间的关系的时候,通常需要用这种模式进行存储
·缓存数据库系统:不具备存储能力,完全用来提供缓存,比如Memcached、Redis
·CAP Therorem
C,A模型:保证一致性和可用性 就是传统数据库-sql数据库
C,P模型:悲观加锁机制(最终一致性 )
A,P模型:只保证可用性 和分区容忍性 比如DNS
·ACID & BASE
主要评估于系统本身基本的可用能力 软状态 以及能实现最终一致性,分布式集群中一般都使用BASE
而数据一致性模型分为以下几种:
·强一致性
无论更新操作在哪个副本上执行,之后的操作都能获得一致性的数据
·弱一致性
用户对某一数据更新需要一定的时间,将由一定的时间段处于不一致状态,在这段时间内为弱一致性
·最终一致性
数据一致性的实现技术:
·Quorum系统 NRW策略
N:总的副本数
R:完成度操作所需要读取最少副本数
W:完成写操作所需要写入最少副本数
强制一致性 R+W>N
比如 :mysql一主两从
最终一致性 R+W
如果打开一个数据库可以
show collection
show users 可以显示用户的信息
show profile 显示性能剖析,必须打开相关功能才可以
show logs 显示日志文件
MongoDB安装及CRUD操作
创建数据库:
(无需创建)
> use testdb
switched to db testdb
> show dbs
admin (empty)
local 0.078125GB
> show collections
可以看到,没有其数据库,因为真正创建数据之前 数据库是不能够被创建的
插入数据:
> db.testcoll.insert ( {name:"tom"})
> show collections
system.indexes
testcoll
#由此看到 索引是自动生成的
#查看是否存在数据:
#将集合中查找数据,空为所有
> db.testcoll.find()
{ "_id" : ObjectId("531fac302d14ad45ff3edbdd"), "name" : "tom" }
#在mongodb中,默认为集合中为每个文档中自动生成一个对应的ID,而每个ID的号码是随机的
再次插入:
> db.testcoll.insert ({name:"jerry"})
> db.testcoll.find()
{ "_id" : ObjectId("531fac302d14ad45ff3edbdd"), "name" : "tom" }
{ "_id" : ObjectId("531faced2d14ad45ff3edbde"), "name" : "jerry" }
#前缀号不同,尾号编码按顺序加1
查看状态
> db.testcoll.stats()
{
"ns" : "testdb.testcoll", #名字为testdb库下的testcoll
"count" : 2, #有2行数据
"size" : 76, #Collectionl大小是多少
"avgObjSize" : 38, #平均每个obj的大小是多少
"storageSize" : 4096, #存储时占用的空间大小
#扩展块等等-----
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
删除集合
> db.testcoll.drop ()
true
> show collections
system.indexes
可以看到,我们虽然清空了集合但是数据库依然在,因为数据库初始化的时候很多数据都已经被保存下来了,而且相对来说还不算小,因为它要存储日志等相关信息的
> show dbs;
admin (empty)
local 0.078125GB
testdb 0.203125GB
进入到相关目录查看存储了哪些文件
# cd /mongodb/data/
# ll
total 294936
drwxr-xr-x 2 mongod mongod 4096 Mar 12 08:37journal #
-rw------- 1 mongod mongod67108864 Mar 12 08:24 local.0 #local数据库
-rw------- 1 mongod mongod16777216 Mar 12 08:24 local.ns
-rw------- 1 mongod mongod67108864 Mar 12 08:45testdb.0 #testdb数据库
-rw------- 1 mongod mongod 134217728 Mar 12 08:37 testdb.1
-rw------- 1 mongod mongod16777216 Mar 12 08:45testdb.ns
drwxr-xr-x 2 mongod mongod 4096 Mar 12 08:37 _tmp
MongoDB常用操作:
如何实现查询
collection名称+find方法(查询标准比如年龄大于某个数字).sort为排序默认以升序排序,如下所示
CollectionQueryCriteriaModifiler
db.User.find( {age:{ $gt:18 } } ).sort ( { age:1 } )
每个find都会返回一个游标,所以将符合条件的所有的 collection执行的字段全部返回
需要注意的是使用find查询的时候 图中只显示的是查询标准没有声明显示哪些字段,那么其将所有符合collection的字段全部打印,如果想找出符合头一个collection的字段,那么则需要使用find1方法 只查询一个
创建文档
因为支持javascript语法架构因此支持for循环:
> for(i=1;i db.testcoll.find()
{ "_id" : ObjectId("531fb4ce6188101d937d4fd0"),"Name" : "User1", "Age" : 1, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
{ "_id" : ObjectId("531fb4ce6188101d937d4fd1"),"Name" : "User2", "Age" : 2,
#--------------------此处略--------------------------
{ "_id" : ObjectId("531fb4ce6188101d937d4fe3"),"Name" : "User20", "Age" : 20, "Gender": "M", "preferbook" : ["blue book", "yellow book" ] }
Type "it" for more
#默认值能显示20个 需要键入it命令 来查看以下航
使用limit限定特定行数
> db.testcoll.find().limit(3)
{ "_id" : ObjectId("531fb4ce6188101d937d4fd0"),"Name" : "User1", "Age" : 1, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
{ "_id" : ObjectId("531fb4ce6188101d937d4fd1"),"Name" : "User2", "Age" : 2, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
{ "_id" : ObjectId("531fb4ce6188101d937d4fd2"),"Name" : "User3", "Age" : 3, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
删除行
> db.testcoll.remove({Age:10})
> db.testcoll.find().limit(11)
{ "_id" : ObjectId("531fb4ce6188101d937d4fd8"),"Name" : "User9", "Age" : 9, "Gender" : "M", "preferbook" :["blue book","yellow book" ] }
{ "_id" : ObjectId("531fb4ce6188101d937d4fda"),"Name" : "User11", "Age" : 11, "Gender" : "M","preferbook" : ["blue book","yellowbook" ] }
{ "_id" : ObjectId("531fb4ce6188101d937d4fdb"),"Name" : "User12", "Age" : 12, "Gender" : "M","preferbook" : ["blue book","yellowbook" ] }
删除用户名为User14的行删除
> db.testcoll.remove({Name:"User14"})
删除用户名为User12 改为32
> db.testcoll.update({Name:"User12"},{$set: {Age:32}})
查找(find)条件:
格式:db.testcoll.find”(,)”
find类似于SQL语句中的SELECT语句,其中相当于sql语句总的where自居,而相当于要选定的字段
如果使用find()格式中不包含,那么意味着返回对应的结果的所有的文档
查找年龄大于93的用户
> db.testcoll.find({Age: {$gte:93}})
如果只想只显示用户名和姓名和年龄:
> db.testcoll.find({Age: {$gte:93}},{Name: 1, Age: 1})
#{Name: 1, #表示显示用户名
# Age: 1} #表示显示年龄
:1表示 to的意思 意思为将其显示出来
用于多个选择条件
逻辑运算
逻辑运算一般用于多个选择条件,MongoDB支持的逻辑运算如下几种:
$or 或运算
$and 与运算
$not 非运算
$nor 反运算
例:
> db.testcoll.find({$and: [{Age: {$gt 61}},{Age: {$lt: 80}}]})
元素查询(element)
如果要根据文档中是否存在某字段等条件来挑选文档,则需要用到元素运算
$exists 根据指定字段的存在性挑选文档
$mod 将指定字段的值进行取模运算,并返回其余数为指定的文档
$type 返回指定字段的值类型为指定类型的文档
例:
> db.testcoll.insert({Name: "User101",Age:101,Gender:"F", Address: "BeiJing"})
查找只有address的文档
> db.testcoll.find({Address: {$exists:true}})
{ "_id" : ObjectId("531fc4bf4b7e74e8a40e004e"),"Name" : "User101", "Age" : 101,"Gender" : "F", "Address" : "BeiJing" }
true为包含,如果改为flase则取反
更新操作
使用multi更改多个
将年龄大于80的用户的性别全部改为F
> db.testcoll.update({Age: {$gt:80}},{$set: {Gender: "F"}},{multi: ture})
删除指定字段,使用unset指定字段列表
> db.testcoll.update({Name: "User80"},{$unset: {preferbook:""}})
页:
[1]