MongoDB常识
MongoDB Shell是MongoDB自带的交互式Javascript shell,所以可直接执行JS脚本,用来对MongoDB进行操作和管理的交互式环境。
ObjectId:
MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时。
系统保留数据库名称
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
文档字段类型:
MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
如:
db.reply.insert({name:"美丽",age:10});
db.reply.insert({name:"美丽",age:'50岁了',sex:0})
capped collections
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!
- 可以插入及更新,但更新不能超出collection的大小,否则更新失败.
- 它有很高的性能以及队列过期的特性(过期按照插入的顺序)
- 文档在磁盘上存放位置也是按照插入顺序来保存的.
- 使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
- 删除之后,你必须显式的重新创建这个 collection。
用法:
- 用法1:储存日志信息
- 用法2:缓存一些少量的文档
MongoDB URI 协议:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
例子:
//更新title=ddddddddddd的所有记录, title被更新为2323
db.col.update({title:"ddddddddddd"}, {$set:{title:"2323"}},{multi:true});
更多实例:
//只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } ); //全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true ); //只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false ); //全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); //全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true ); //只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
save() 方法
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
备注:
如果集合内部已经存在一个和document 相同的 "_id" 的记录,Mongodb会把document对象替换集合内已存在的记录,如果不存在,则会插入document对象。
find()方法
AND
db.col.find({key1:value1, key2:value2}).pretty()
OR
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
demo:
//混合AND ,Or查询
db.col.find({
title:"2323",
$or:[{by:"菜鸟教程"},{name:"name1"}]
})
使用正则表达式
db.posts.find({post_text:{$regex:"runoob"}}) 或者:
db.posts.find({post_text:/runoob/})
其他:
//正则匹配
//查询 title 包含"教"字的文档:
db.col.find({title:/教/}) //查询 title 字段以"教"字开头的文档:
db.col.find({title:/^教/}) //查询 titl e字段以"教"字结尾的文档:
db.col.find({title:/教$/}) //$type操作符
db.col.find({"title" : {$type : 2}})
//或
db.col.find({"title" : {$type : 'string'}}) //Limit() 方法
//db.COLLECTION_NAME.find().limit(NUMBER) //Skip() 方法
//db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER) //排序,1:升序, -1:降序
//db.COLLECTION_NAME.find().sort({KEY:1})
db.col.find().sort({likes:-1})
索引:
创建索引:
db.collection.createIndex(keys, options)
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
//demo: 创建索引
db.values.createIndex({open: 1, close: 1}, {background: true}) //1、查看集合索引
db.col.getIndexes() //2、查看集合索引大小
db.col.totalIndexSize() //3、删除集合所有索引
db.col.dropIndexes() //4、删除集合指定索引
db.col.dropIndex("索引名称")
高级索引:
考虑以下文档集合(users ):
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
1) 索引数组字段:
db.users.ensureIndex({"tags":1})
该索引支持如下查询:
db.users.find({tags:"cricket"})
2)索引子文档字段
db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
该索引支持如下查询;
db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})
原子操作常用命令
//$set
//用来指定一个键并更新键值,若键不存在并创建。
{ $set : { field : value } } //$unset
//用来删除一个键。
{ $unset : { field : 1} } //$inc
//$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
{ $inc : { field : value } } //$push
{ $push : { field : value } }
//把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。 //$pushAll 同$push,只是一次可以追加多个值到一个数组字段内。
{ $pushAll : { field : value_array } } //$pull
//从数组field内删除一个等于value值。
{ $pull : { field : _value } } //$addToSet
//增加一个值到数组内,而且只有当这个值不在数组内才增加。 //$pop
//删除数组的第一个或最后一个元素
{ $pop : { field : 1 } } //$rename
//修改字段名称
{ $rename : { old_field_name : new_field_name } } //$bit
//位操作,integer类型
{$bit : { field : {and : 5}}} //偏移操作符
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] } > t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true ) > t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }
索引限制
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。
索引不能被以下的查询使用:
- 正则表达式及非操作符,如 $nin, $not, 等。
- 算术运算符,如 $mod, 等。
- $where 子句
Map Reduce
以下是MapReduce的基本语法:
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number
}
)
使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。
Map 函数必须调用 emit(key, value) 返回键值对。
参数说明:
- map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
- reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
- out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
- query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
- sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
- limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
参考引用:
https://blog.****.net/qq_27093465/article/details/81332552
http://www.runoob.com/mongodb/mongodb-tutorial.html