1、概念及特点
说明:由于部分语句中$ 符号无法正常显示,使用¥代表
概念
MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Objectid。
补充:MongoDB是一个分布式文件系统,满足CAP定理,即分布式计算系统不可能同时满足一致性、可用性、分割容忍。一致性是指所有节点在同一时间具有相同数据,可用性是指每个请求不管是成功还是失败都有响应。
特点
●高性能、高可用、易扩展
●mongodb是模式自由的(schema-free),同一集合中的文档结构可以不同,不需要事先定义集合的结构
●复制集可以提高数据的安全性,分片集群可以实现负载均衡
●不支持事务,隔离性差,会出现脏读、幻读和不可重复读
●读写操作是非序列化的
●可能会读到尚未持久化的数据,对于复制集,采用local形式读取主节点上的数据,有回滚的风险
●多文档的写操作不是原子性的,单文档的写操作是原子的
●会缓存索引信息、最近使用的数据,不会缓存查询结果
●写操作是延迟的,默认在60秒以内写入磁盘。先将写操作写入日志,然后缓存在内存,最后写入磁盘。
●单个文档大小不可以超过16M

存储引擎
WiredTiger存储引擎
●支持文档级别的并发,允许多个客户端同时对同一个集合中的文档执行写操作。
●对于读写操作,使用乐观并发控制,仅在global、database、collection级别使用意向锁
●通过journal和checkpoint实现数据持久化,在将数据写入磁盘之前将数据写入日志,并为写入磁盘的数据设置checkpoint
●支持对集合和索引的压缩
●MongoDB使用存储引擎内部缓存即文件系统缓存,存储引擎内部缓存大小为60%的RAM减去1GB或1GB两者中大的
MMAPv1 存储引擎
●使用系统级的文件映射,在插入、读、更新数据方面性能突出
●不支持文档级别的锁,并发性能差
●支持journal日志
●尽可能多的使用内存
2、显示数据库信息
show dbs显示所有数据库
use db_name 创建数据库或切换数据库
db 显示当前所在数据库
db.stats()以字节为单位显示单个数据库的存储情况
db.stats(1024)以kb为单位显示单个数据库的存储情况
db.shutdownServer()关闭数据库服务,首先必须进入admin数据库
db.dropDatabase() 删除数据库,首先必须进入要删除的数据库
show collections显示所有集合
3、增删改查
创建集合
db.createCollection(name, options)创建集合,名字使用双引号括起来
options是可选的,具体的参数有:
capped:bool型,true代表集合是固定大小,同时必须指定size参数或max参数
size:数值型,为固定集合大小最大值
max:数值型,固定集合中包含的最大文档个数
eg:
db.createCollection("mycol", { capped : true, size : 6142800, max : 10000 } )创建封顶表。
补充:读取封顶表中的数据以及想封顶表插入数据速度很快

删除集合
db.collection_name.drop()
插入文档
db.collection_name.insert( { })或db.collection_name.insert( [{ }])向集合中插入json文档或插入一组文档,注意:对非数值型数据使用双引号括起来
eg:db.grade.insert({name:"du",sex:"boy",num:1})
查询文档
db.collection_name.find()或db.collection_name.find().pretty()查询集合中的文档
db.collection_name.find({sex:"boy"})查询特定文档
db.collection_name.find.({num:{¥lt:2}})查询值小于2的文档,另外还可以使用lte代表小于或等于,gt代表大于,gte代表大于或等于,ne代表不等于
db.collection_name.find.({key1:value1, key2:value2})逗号隔开代表AND逻辑
db.collection_name.find({ ¥or: [{key1: value1}, {key2:value2} ] })使用OR逻辑进行多个查询
db.collection_name.find.({},{KEY1:0,KEY2:0,})查询默认显示文档中所有字段,通过将对应字段的value设置为0可以不显示特定字段,未设置的字段则显示,通过将对应字段的value设置为1可以显示特定字段,未设置的字段则不显示,无论何时都显示_id字段,除非显式设置为0。
db.collection_name.find().limit(num)限制显示的文档个数
db.collection_name.find().skip(num)跳过部分文档
db.collection_name.find().skip(num1).limit(num2)首先跳过部分文档,并限制显示个数
db.collection_name.find().sort({KEY:1或-1})对文档按KEY字段升序排列或降序排列
补充:
覆盖查询covered query:使用索引进行查询而不是遍历所有文档进查询
覆盖查询需要满足
●查询中的所有字段是索引的一部分
●结果中的索引字段必须是在同一个索引中,通常需要设置不显示_id字段
●被索引的字段值不能是数组或文档
eg
db.users.ensureIndex({name:1,year:1})
db.users.find({name:"M"},{year:1,_id:0})使用索引
db.users.find({name:"M"},{year:1})不使用索引,默认显示_id字段
更新文档
db.collection_name.update.({},{})将前一个文档更新为后一个文档
db.collection_name.update.({},{},true)将前一个文档更新为后一个文档,如果前一个文档不存在则插入后一个文档
db.collection_name.update( {}, {¥set:{}} )将前一个文档中部分数据更新为后一个文档中的数据
db.collection_name.update( {}, {¥set:{}},false,true )数据库默认只更新查找到的第一个文档,此语句可以更新所有符合条件的文档,false指updateinsert,true指multiinsert
删除文档
db.collection_name.drop()删除集合,即删除所有文档
db.collection_name.remove( {} )删除集合中所有符合条件的文档
db.collection_name.remove( {} ,true)删除集合中符合条件的第一个文档
注意:无法删除封顶表中的文档
4、关系
文档之间的关系包括内嵌和引用。关系可能是一对一、一对多、多对一、多对多
●内嵌
user文档

{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
}

address文档

"_id":ObjectId("52ffc4a5d85242602e000000"),
"city": "Los Angeles",
"state": "California"

address文档嵌入到user文档,这是一对多

{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Benzamin",
"address": [
{
"city": "Los Angeles",
"state": "California"
},
{
"city": "Chicago",
"state": "Illinois"
}]
}

db.users.find({"name":"Tom Benzamin"},{"address":1})查找与普通查找没有区别
内嵌的缺点:如果内嵌文档十分多,会对读写造成影响
●手动引用
将被引用文档的_id字段内嵌到文档,实现引用文档的效果

{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}

使用以下方式查询

var result = db.users.find({"name":"Tom Benzamin"},{"address_ids":1})
var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

●数据库引用
当文档引用了许多集合中的文档时,应该使用数据库引用。在引用文档中应该通过¥db包含被引用文档的数据库名称(可选)、通过¥ref包含被引用文档的所在集合、通过¥id字段指定被引用文档的_id

{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "tutorialspoint"},
"name": "Tom Benzamin"
}

使用以下方式查询

var user = db.users.find({"name":"Tom Benzamin"})
var dbRef = user.address
db[dbRef.$ref].find({"_id":(dbRef.$id)})

5、索引
定义
索引能够存储字段的值(通过B树),并将字段的值按特定方式进行排序,从而实现高效查询。如果没有索引,数据库必须扫描集合中所有文档。但是创建索引会增加磁盘空间,同时也会影响写操作,因为需要为索引字段建立索引。任何修改索引字段的更新会导致索引调整,比如更新文档导致文档大小变化,使得文档需要重新分配空间,存储位置发生变化。另外索引存储在内存中,通过使用索引能提高查询速度,但不必将所有索引存储在内存中,如果含有索引字段的文档一直被插入,并且在查询最近插入的文档,那么内存中只需要保存最近的部分索引值即可。
创建索引
创建索引有foreground和background两种方式,foreground即前台操作,会阻塞数据的读写操作,默认才用采方式,background即后台操作,不会阻塞数据的读写操作,比foreground更加耗费时间。如果集合中含有大量数据,此时创建索引,将会导致大量的IO操作,比如磁盘读写,耗时较长。对于复制集,当主节点创建完索引后,从节点将会采用background方式创建索引,十分耗时,可以先将从节点脱离复制集采用foreground方式手动创建索引,创建完成后,再加入集群。
db.collection_name.ensureIndex({KEY:1})为x字段创建索引,1代表正向,-1代表负向
db.collection_name.ensureIndex({KEY:1},{background:true})在后台创建索引
db.collection_name.getIndexes()创建索引前,最好先检查索引是否已经存在,重复的索引不会提高查询性能

索引种类
●_id索引
集合默认的索引,对于每个文档,数据库都会自动生成一个唯一的_id字段,无法删除,通过_id字段查询性能极高。封顶表没有默认索引,没有_id字段。
●单键索引
最普通的索引
●多键索引
多键指的是字段的值为数组,而不是多个字段。数据库会对数组中每一个字段值创建一个索引条目,但每个条目都引用同一个文档。
注意
不能同时对一个集合中的多个字段创建多键索引
●复合索引
复合索引指的是多个字段。
db.collection_name.ensureIndex({KEY:key_value,KEY:key_value,......})
字段按正向排序还是负向排序很重要!,这决定了查询是否支持sort操作
eg:db.collection_name.ensureIndex({x:1,y:-1})
支持
db.collection_name.find(),sort({x:1})
db.collection_name.find(),sort({x:1,y:-1})
db.collection_name.find(),sort({x:-1,y:1})
不支持
db.collection_name.find(),sort({x:1,y:1})
db.collection_name.find(),sort({x:-1,y:-1})
另外查询必须遵循最左前缀原则,查询语句中必须包含左边的字段,不能跳过左边的字段
如果索引字段的值为文档,需要为文档中的字段创建索引,则可以通过点符号指明索引字段
eg

{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
}

db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})创建索引
db.users.find({"address.city":"Los Angeles","address.state":"California"})查询
●过期索引
在一段时间后,索引过期,相应数据也被删除,适合用户登录信息和日志。
db.collection_name.ensureIndex({KEY:1},{expireAfterSeconds:num}) num秒之后,索引失效,数据被删除
注意
过期索引字段值必须是ISODate类型或ISODate数组类型,不能使用时间戳
如果字段值为数组,则按照最小时间删除
过期索引不能是复合索引,即不能多个字段同时指定过期时间
删除时间并不精确,删除过程由后台每60秒执行一次,同时删除也需要时间,所以存在误差
eg
db.students.insert({gradutetime:new Date()})
db.students.ensureIndex({gradutetime:1},{expireAfterSeconds:10})
●全文索引
定义:全文索引的值为字符串“text”(普通索引的值为1或-1)
创建
db.collection_name.ensureIndex({KEY:"text"})为一个字段创建全文索引
db.collection_name.ensureIndex({KEY:"text",KEY:"text"})为多个字段创建索引
db.collection_name.ensureIndex({"¥":"text"})为所有字段创建索引
删除
db.collection_name.dropIndex({索引名})删除索引
使用
db.collection_name.find({¥text:{¥search:"aa bb"}})查找包含aa或bb字段值的文档
db.collection_name.find({¥text:{¥search:"aa -bb"}})查询包含aa但不包含bb字段值的文档
db.collection_name.find({¥text:{¥search:"aa bb"}},{score:{¥meta:"textScore"}})查找包含aa或bb字段值的文档并返回相似度
db.collection_name.find({¥text:{¥search:"aa bb"}},{score:{¥meta:"textScore"}}).sort({score:{¥meta:"textScore"}})查找包含aa或bb字段值的文档并按相似度排序
注意**:
●每个集合中能建立一个全文索引,即不能在一个集合上多次使用创建索引命令
●每次查询只能指定一个¥text
●查询中包含了¥text,hint不再起作用
●不支持中文

●稀疏索引
定义
稀疏性指的会不会为不存在索引字段的文档创建索引。如果是稀疏索引,当文档中不存在索引字段时,就不会为此文档创建索引,非稀疏索引,即使文档中不存在索引字段也会为文档创建索引。索引默认为非稀疏索引。稀疏索引只索引了部分文档,非稀疏索引则索引了全部文档。
创建
db.collection_name.insert({m:1})插入数据
db.collection_name.insert({n:1}) 插入数据
db.collection_name.ensureIndex({m:1},{sparse:true})创建稀疏索引,不会为第二个文档创建索引
使用
db.collection_name.find({m:{$exists:false}}) 查找不存在字段m的文档,结果竟然有第二个文档。因为是稀疏索引,理论上结果应该为空,如果根据索引查找,结果肯定为空。mongodb在稀疏索引上查找不存在的文档时,将不会使用稀疏索引!
db.collection_name.find({m:{¥exists:false}}).hint("m_1")使用hint强制使用稀疏索引,结果为空

稀疏索引常常和唯一索引一起使用,从而防止插入重复数据,同时忽略哪些不包含索引字段的文档,即不建立索引,但是文档仍然可以被保存。
●唯一索引
定义
索引字段不会存储重复的值,唯一索引保证了了字段的值具有唯一性。可以实现如果数据存在则不插入,如果不存在则插入的功能。
创建
db.collection_name.ensureIndex({m:1},{unique:true})为字段m创建唯一索引
●哈希索引
主要用于分片集群中,通过对分片key使用哈希索引,以遍对数据进行分片和路由。
创建
db.collection_name.ensureIndex({a:"hashed"})
注意
哈希索引只支持相等比较,不支持range查询
哈希索引只支持一个字段,不能和其他字段组合
哈希索引不能和unqiue同时使用
●地理位置索引

索引限制
●索引键的总大小不能超过1024个字节
●单个集合索引数量不能超过64个
●索引名字的长度不能超过128个字符
●复合索引的字段个数不能超过31个
●查询时不能同时使用全文索引和地理索引
●多键索引不支持覆盖查询
●索引大小不能超过内存大小

创建索引需要考虑
●在插入数据后需要再次构建索引,影响写入效率
●索引消耗内存空间和磁盘空间
●如果经常在含有大量数据的数据库上进行查询,则创建索引
●不使用索引后,删除索引

索引构建情况分析
●mongostat工具
bin/mongostat --help查看帮助
bin/mongostat -h 127.0.0.1:portnum查看结果,重要的数据有
qr|qw:客户端等待从数据库读写的队列长度
ar|aw:执行读写操作的客户端个数
idx miss:索引不命中百分比
dirty:缓存中的脏数据
vsize:虚拟内存消耗
res:物理内存消耗
●profile集合
profile集合中存储着有关读写操作、游标操作、数据库命令的信息,system.profile是一个封顶表
db.getProfilingStatus()连接数据库后,通过此命令可以获取profile集合状态。profile有三个级别,0代表profile关闭,不会记录任何操作;1会配合阈值slowms,记录所有超过阈值的操作;2会记录所有操作
db.setProfilingLevel(num)设置profile级别
db.system.profile.find().sort({¥natural:-1})根据写入时间早晚排序,此处是最晚的在前面
注意
上产环境下,不要使用profile,profile会使数据库性能下降
●日志
可以在mongo.conf中配置日志详细程度,使用verbose=vvvvv,v越多,日志越详细,最多有5个v
●explain
在语句中使用,比如db.collection_name.find().explain(),结果中包含查询是否使用索引的信息
explain含有三种模式
queryPlanner:查询优化选择的计划和被拒绝的计划,默认为此模式
executionStats:被选中执行计划的详细信息
allPlansExecution:被选中执行和被拒绝执行的计划信息
6、聚合和管道

聚合是对文档进行分组,然后对成组的数据进行操作,并返回一个文档。聚合相当于mysql中的gyoup by。通过aggregate函数执行聚合操作,即:db.collection_name.aggregate(aggregate_operation)

eg

db.collection_name.aggregate({¥group : {_id : "¥by_user", number: {¥sum : 1}}})

db.collection_name.aggregate({¥group : {_id : "¥by_user", number: {¥sum : "$point"}}})

对集合中的文档按by_user字段的值进行分组,统计每组中的个数,返回一个包含_id、number字段的文档

聚合操作类型

表达式 描述 例子
¥sum 计算总和 db.mycol.aggregate([{¥group : {_id : "¥by_user", num_tutorial : {¥sum : "¥var_name"}}}])
¥avg 计算平均值 db.mycol.aggregate([{¥group : {_id : "¥by_user", num_tutorial : {¥avg : "¥var_name"}}}])
¥min 获取文档中对应字段最小值 db.mycol.aggregate([{¥group : {_id : "¥by_user", num_tutorial : {¥min : "¥var_name"}}}])
¥max 获取文档中对应字段最大值 db.mycol.aggregate([{¥group : {_id : "¥by_user", num_tutorial : {¥max : "¥var_name"}}}])
¥push 将字段值插入到数组中 db.mycol.aggregate([{¥group : {_id : "¥by_user", url : {¥push: "¥url"}}}])
¥addToSet 将值插入到数组中,但不创建副本 db.mycol.aggregate([{¥group : {_id : "¥by_user", url : {¥addToSet : "¥url"}}}])
¥first 获取每组中第一个文档,之前必须使用sort排序 db.mycol.aggregate([{¥group : {_id : "¥by_user", first_url : {¥first : "¥url"}}}])
¥last 获取每组中最后一个文档,之前必须使用sort排序 db.mycol.aggregate([{¥group : {_id : "¥by_user", last_url : {¥last : "¥url"}}}])

管道

管道类似于Linux Shell中的管道操作符,即将多条命令连在一起执行,前一条命令的结果作为下一条命令的输入

●¥project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

●¥match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

●¥limit:用来限制MongoDB聚合管道返回的文档数。

●¥skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

●¥unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

●¥group:将集合中的文档分组,可用于统计结果。

●¥sort:将输入文档排序后输出。

●¥geoNear:输出接近某一地理位置的有序文档。

eg

db.unicorns.aggregate([{¥match: {weight:{¥lt:600}}},
    {¥group: {_id:"¥gender",  total:{¥sum:1},
      avgVamp:{¥avg:"¥vampires"}}},
    {¥sort:{avgVamp:-1}} ])
db.unicorns.aggregate([{¥unwind:"¥loves"},
    {¥group: {_id:"¥loves",  total:{¥sum:1},
    unicorns:{¥addToSet:"¥name"}}},
    {¥sort:{total:-1}},
    {¥limit:1} ])

可以找出独角兽最喜欢吃的食物,以及拿到独角兽们喜欢吃的食物名单。
7、并发
MonogoDB使用的锁分为global、database、collection、document几个级别,包含读锁、写锁(wiredTiger引擎支持document级别锁,MMAPv1引擎不支持)。根据是否排他,分为共享锁、排它锁、意向共享锁、意向排它锁,读锁为共享锁,写锁为排它锁。意向共享锁和意向排它锁表明读写操作获取更低级别资源的意图,在高级别上使用意向锁,在最终级别上使用共享锁或排它锁。锁的级别越低,并发能力越高。

WiredTiger引擎采用了乐观并发控制,在global、database、collection级别使用意向锁,当检测到多个操作有冲突时,操作会进行重试。但删除集合时,仍会在数据库级别获取排它锁。乐观的并发控制主要是针对文档的操作

当执行一些特别耗时的操作时。读写操作会yield,允许其他操作获取锁,执行相应操作,当前操作重新尝试获取锁。但索引文件的加载和刷新不会yield。

对于复制集,主节点写操作时,会锁定集合所在数据库以及local数据库,因为需要向oplog中写入数据。从节点在进行写操作时,不允许读操作。
8、日志分类
journal日志(以wiredtiger引擎为例)
概念
数据库先将操作写入日志,然后将数据写入磁盘,防止数据在写入磁盘过程中发生失败,导致数据丢失。
日志特点
●存储引擎自动删除不需要的日志文件
●单个日志文件不超过100MB
●采用预分配的机制为日志分配空间
同步日志中的操作到磁盘的间隔
●每隔60秒或日志文件达到2GB
●实时同步
●创建新的日志文件,则同步旧的文件
恢复过程
●mongod会在启动时在磁盘文件中寻找最新的checkpoint
●在日志文件中寻找带有最新checkpoint的记录
●应用日志文件中checkpoint之后的操作

系统日志
概念
记录服务器启动和停止过程,以及在运行过程中发生的异常,通过logpath参数指定日志存储位置

慢查询日志
概念:记录执行时间超过设定时间的操作,通过db.runcommand({profile:level_num})设定
eg
db.runcommand({ profile: 1, slowms: 200 }记录执行时间超过200ms的操作

oplog日志
复制集所特有的,用于同步数据的日志
9、GridFS
●gridfs是一种文件的存储方式,用于存储超过16M的文挡
●gridfs将文件分割成多个片段,以文档的形式存储在fs.files集合中,文档大小通常为255k/个
●gridfs最好只保存只读的数据,从而保证原子性,因为mongodb不支持多文档原子操作
●gridfs用fs.chunks存储文件的元数据
●可以通过mongofiles和mongo管理gridfs中的数据
eg
bin/mongofiles --host 127.0.0.1 --port 28004 -d records list 列出record数据库中GridFS集合中
bin/mongofiles --host 127.0.0.1 --port 28004 -d records put mongofiles2.txt 向records数据库中添加文件
bin/mongofiles --host 127.0.0.1 --port 28004 -d records delete mongofiles2.txt 删除文件
10、用户角色
●数据库角色
read:用户具有读权限
readWrite:用户具有读写权限
userAdmin:用户管理员,可以对指定数据库创建角色、修改用户角色,但不能访问数据库的数据
dbAdmin:数据库管理员,可以对指定数据库创建索引、集合,但不能创建用户
dbOwner:具有readWrite、userAdmin、dbAdmin等所有权限
●所有数据库角色
readAnyDatabase:对所有数据库具有读权限
readWriteAnyDatabase:对所有数据库具有读写权限
userAdminAnyDatabase:所有数据库的用户管理员
dbAdminAnyDatabase:所有数据库的数据库管理员
●集群角色
clusterManger:集群管理员,可以访问config、local数据库,从而配置集群和复制集。此角色可以调整集群节点部署和查看一些数据库信息
hostManger:host管理员,管理和监控各个实例
clusterMonitor:能够访问监控工具
clusterAdmin:具有clusterManger、hostManger、clusterMonitor的权限,并具有删除数据库的权限
●备份角色
backup:备份数据库的权限
restore:恢复数据库的权限
●超级用户
root具有任何权限
11、数据安全及运行状况
如何保证数据安全
●网络隔离,只能内网访问
●限制特定ip访问
●开启权限认证
●使用复制集
●开启journal日志

备份与恢复
mongodump -h dbhost -d dbname -o dbdirectory备份指定数据库到指定目录
eg:mongodump -h 127.0.0.1:28004 -d test -o /home
mongorestore -h dbhost -d dbname --directoryperdb dbdirectory恢复数据
eg:mongodump -h 127.0.0.1:28004 -d test -o --directoryperdb /home/test
尽量不要使用mongoexport和mongoimport导出和导入数据,使用mongodump和mongorestore代替

查看运行状态
mongostat查看mongod运行状态
重要字段
inserts、query、update、delete每秒钟插入、查询、更新、删除操作的数量
dirty脏数据的字节数
used使用的缓存大小
vsize使用的虚拟内存大小
qr|qw等待读写数据的队列长度
ar|aw执行读写操作的客户端数量

mongotop查看读写数据花费的时间

补充:
MongoDB与Mysql比较
●Mysql是关系型数据库,数据库基于表,数据表的结构需要预先定义,存储在表中的数据结构形式相同,MongoDB是非关系型数据库,数据库基于文档,文档存储在集合中,集合的结构不需要事先定义,同一个集合中的文档结构可以不同
●Mysql支持事务,支持ACID属性,MongoDB不支持事务
●Mysql通过纵向扩展,即提升单台主机的处理能力,解决存储问题,MongoDB通过横向扩展,即增加主机数量,解决存储问题
●Mysql通过结构化查询语句操作数据,语法统一,MongoDB通过非结构化语句操作数据,语法不统一
●Mysql支持join连接。MongoDB不支持join连接
●Mysql查询功能强大,MongoDB查询功能有限

参考
The MongoDB 3.2 Manual
MongoDB教程-v1.0

MongoDB基础的更多相关文章

  1. mongodb基础用法

    安装部分 mongodb配置方法 mongodb的安装目录 C:\MongoDB\Server\3.2\bin 创建以下目录 c:\mongo\log c:\mongo\db 创建mongodb的配置 ...

  2. mongodb基础系列——数据库查询数据返回前台JSP(一)

    经过一段时间停顿,终于提笔来重新整理mongodb基础系列博客了. 同时也很抱歉,由于各种原因,没有及时整理出,今天做了一个demo,来演示,mongodb数据库查询的数据在JSP显示问题. 做了一个 ...

  3. MongoDB基础知识 02

    MongoDB基础知识 02 6 数据类型 6.1 null : 表示空值或者不存在的字段 {"x":null} 6.2 布尔型 : 布尔类型只有两个值true和false {&q ...

  4. MongoDB基础知识 01

    MongoDB基础知识  1. 文档  文档是MongoDB中的数据的基本单元,类似于关系型数据库管理系统的行. 文档是键值对的一个有序集.通常包含一个或者多个键值对. 例如: {”greeting& ...

  5. MongoDB基础教程系列--未完待续

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  6. DataBase MongoDB基础知识记录

    MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...

  7. MongoDB 基础(2019年开篇)

    MongoDB基础知识: 1.什么是MongoDB NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL". MongoDB是一个介于关系数据库和非关系数据库之 ...

  8. MongoDB基础学习

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  10. windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

随机推荐

  1. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  2. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  3. 初步了解nodejs

    什么是Node.js? 很多初学者并没有真正地理解Node.js到底是什么.nodejs.org网站中的描述也没有多大帮助. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情 ...

  4. JQuery easyUI DataGrid 创建复杂列表头(译)

    » Create column groups in DataGrid The easyui DataGrid has ability to group columns, as the followin ...

  5. java中的内部类

    /** * 内部类 ?? * 定义在一个内部的类,被称为内部类. * 内部类里有类体,方法体 * 内部类所在的类,被称为外部类. * --------------------------------- ...

  6. Android开发学习——动画

    帧动画> 一张张图片不断的切换,形成动画效果* 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长              ...

  7. TabLayout + ViewPager

    一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0'compile 'com.android. ...

  8. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  9. oracle 误删数据恢复

    1.根据时间点查系统版本号scn: select timestamp_to_scn(to_timestamp('2013-01-07 11:20:00','YYYY-MM-DD HH:MI:SS')) ...

  10. 关于VS2015支持编译Linux程序的问题

    现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...