MongoDB 基本语法笔记

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.csdn.net/qq_27093465/article/details/81332552

http://www.runoob.com/mongodb/mongodb-tutorial.html







原文地址:https://www.cnblogs.com/snow-man/p/10150175.html