mongodb整理

  • mongodb是什么

mongodb是一种开源的流行的非关系型数据库(NoSql),具有高可用、高性能、可扩展等有点。mongodb中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”。

  • 安装&启动

  • 基本操作

1、insert  :db.mytest.insert({“name”: “x”,”age”:20})

db.mytest.insert({“name”: “y”,”age”:21})

默认连接db为test,自建集合mytest

2、find:db.mytest.find()

“_id”字段是数据库默认给我们加的GUID,目的就是保证数据的唯一性

查询条件可以包含  $gt(>), $gte(>=),$lt(<), $lte(<=), $ne(!=), $eq(==)、”都好或者无关键字”(And),$or(OR),$in(In),$nin(NotIn)、正则表达式、$where

db.mytest.find({“age”:{$gt:2}})

db.mytest.find({$or:[{“age”:21},{“age”:30}]})

db.mytest.find({“age”:{$in:[21,25]}})

db.mytest.find({$where:function(){return this.name == “y”}})

3、update:db.mytest.update({“name”:”x”},{“name”:”x”,”age”:30})

第一个参数为“查找的条件”,第二个参数为“更新的值”,第三个参数设为true表示:如果没有此数据,则做insert操作,第四个参数设为true表示更新所有符合条件的,否则只更新一条。

$inc、$set局部更新修改器

db.mytest.update({“name”:”y”},{$set:{“age”:28}})

4、remove:db.mytest.remove({“name”:”x”})

如果不加参数将删除所有数据

5、count:db.mytest.count({“age”:28})

6、distinct:db.mytest.distinct(“age”)

7、group:db.mytest.group({“key”:{“age”:true},  “initial”:{“mytest”:[]}, “$reduce”:function(cur,prev){ prev.mytest.push(cur.name);}})

结果:[

                {
                       “age” : 28,
                      “mytest” : [
                             “y”
                      ]
               },
                {
                       “age” : 25,
                      “mytest” : [
                      “z”
                      ]
               }
        ]
key:  这个就是分组的key,我们这里是对年龄分组。

initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=28的value的list分享一个initial函数,age=25同样也分享一个initial函数。

$reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次

为initial中的{”mytest“:[]}。有多少个文档, $reduce就会调用多少次。

db.mytest.group({“key”:{“age”:true},  “initial”:{“mytest”:[]}, “$reduce”:function(cur,prev){ prev.mytest.push(cur.name);},”finalize”:function(out){out.count = out.mytest.length;},”condition”:{“age”:{$lt:27}}})

condition: 分组添加过滤条件。

finalize:每一组文档执行完后,会触发此方法,所以count放在这里。

  • 索引 (删除之前数据,循环插入100000数据)

for(var i = 0;i<100000;i++){ var rand = parseInt(i*Math.random()); db.person.insert({“name”:”xslhj”+i,”age”:i,”score”:rand}) }

1、explain方法,db.mytest.find({“name”:”z”}).explain()

字段说明:

cursor:返回游标类型,有BasicCursor和BtreeCursor,后者意味着使用了索引。

nscanned:扫描document的行数。

n:返回的文档行数。

millis:耗时(毫秒)。

indexBounds:所用的索引。

2、添加索引:db.mytest.ensureIndex({“name”:1})

“1”:表示按照name进行升序,“-1”:表示按照name进行降序

3、唯一索引:db.mytest.ensureIndex({“name”:1},{“unique”:true})

4、组合索引:db.mytest.ensureIndex({“names”:1},{“age”:1})

5、删除索引:db.mytest.dropIndexes(“name_1”)