mongodb使用心得简单总结

1.mongodb特性

1)mongo是一个面向文档的数据库,它集合了nosql和sql数据库两方面的特性。
2)所有实体都是在首次使用时创建。
3)没有严格的事务特性,但是它保证任何一次数据变更都是原子性的。
4)也没有固定的数据模型
5)mongo以javascript作为命令行执行引擎,所以利用shell进行复杂的计算和查询时会相当的慢。
6)mongo本身支持集群和数据分片
7)mongo是c++实现的,支持windows mac linux等主流操作系统
8)性能优越,速度快

2.mongo常用操作

1.增删操作

  1. db.user.insert({name:'aaaa',age:30});
  2. db.user.save({name:'aaaa',age:30});
  3. db.collection.insertOne({});(3.2新特性)
  4. db.collection.deleteOne(<filter>,{});(3.2新特性)
  5. db.collection.remove({name:'aaa'});
  6. db.collection.remove();(删除全部)

2.更新操作

  1. db.users.update ({   " name"   :   "joe"   },   joe );
  2. db.users.update ({   " name"   :   "joe"   },   joe,  true );------upsert模式
  3. db.users.update ({   " name"   :   "joe"   },   joe,  true ,true);------MULTI模式

update是对文档替换,而不是局部修改默认情况update更新匹配的第一条文档,multi模式更新所有匹配的

3.查询操作

-- 普通查询

  1. db.user.find();
  2. db.user.find({name:'aaa'});
  3. db.user.findOne({name:'aaa'});

-- 模糊查询

  1. db.UserInfo.find({userName :/A/}) (名称%A%)
  2. db.UserInfo.find({userName :/^A/}) (名称A%)

4.操作符

1.$lt, $lte,$gt, $gte(<, <=, >, >= )    
    2.$all    数组中的元素是否完全匹配  db.things.find( { a: { $all: [ 2, 3 ] } } );
    3.$exists  可选:true,false  db.things.find( { a : { $exists : true } } );
    4.$mod  取模:a % 10 == 1  db.things.find( { a : { $mod : [ 10 , 1 ] } } );
    5.$ne 取反:即not equals  db.things.find( { x : { $ne : 3 } } );
    6.$in 类似于SQL的IN操作  db.things.find({j:{$in: [2,4,6]}});
    7.$nin $in的反操作,即SQL的  NOT IN  db.things.find({j:{$nin: [2,4,6]}});
    8.$nor $or的反操作,即不匹配(a或b)  db.things.find( { name : "bob", $nor : [ { a : 1 },{ b : 2 }]})
    9.$or Or子句,注意$or不能嵌套使用  db.things.find( { name : "bob" , $or : [ { a : 1 },{ b : 2 }]})
    10.$size  匹配数组长度  db.things.find( { a : { $size: 1 } } );
    11.$type  匹配子键的数据类型,详情请看  db.things.find( { a : { $type : 2 } } );

5.数组查询

$size 用来匹配数组长度(即最大下标) 
    // 返回comments包含5个元素的文档  
    db.posts.find({}, {comments:{‘$size': 5}}); 
    // 使用冗余字段来实现 
    db.posts.find({}, {‘commentCount': { ‘$gt': 5 }});  
    $slice 操作符类似于子键筛选,只不过它筛选的是数组中的项 
    // 仅返回数组中的前5项 
    db.posts.find({}, {comments:{‘$slice': 5}}); 
    // 仅返回数组中的最后5项 
    db.posts.find({}, {comments:{‘$slice': -5}}); 
    // 跳过数组中的前20项,返回接下来的10项 
    db.posts.find({}, {comments:{‘$slice': [20, 10]}}); 
    // 跳过数组中的最后20项,返回接下来的10项 
    db.posts.find({}, {comments:{‘$slice': [-20, 10]}}); 
    MongoDB 允许在查询中指定数组的下标,以实现更加精确的匹配 
    // 返回comments中第1项的by子键为Abe的所有文档 
    db.posts.find( { "comments.0.by" : "Abe" } );

3.索引的使用

1.创建索引

db.things.ensureIndex ({'j': 1});
    创建子文档 索引
    db.things.ensureIndex ({'user.Name' : - 1});
    创建 复合 索引
    db.things.ensureIndex ({
    'j' : 1 ,   //  升序
    'x' : - 1   //  降序
    });
    如果 您的 find 操作只用到了一个键,那么索引方向是无关紧要的 
    当创建复合索引的时候,一定要谨慎斟酌每个键的排序方向

2.修改索引

修改索引,只需要重新 运行索引 命令即可 
    如果索引已经存在则会 重建, 不存在的索引会被 添加 
    db . things . ensureIndex ({
        --- 原来的索引会 重建
        'user.Name ' :   - 1 ,
        --- 新增一个升序 索引
        'user.Name ' :   1 ,
        ---  为 Age 新建降序 索引
        'user.Age ' :   - 1
    },
    打开后台执行
    {    ‘background' :   true}
    );
    重建索引
    db. things .reIndex();

3.删除索引

删除集合中的所有 索引
    db . things . dropIndexes (); 
    删除指定键的索引 
    db.things.dropIndex ({
        x :   1 ,
        y :   - 1
    }); 
    使用 command 删除指定键的 索引
    db.runCommand ({
        dropIndexes : 'foo ' ,
        index  :   {   y :   1   }
    }); 
    使用 command 删除所有 索引
    db . runCommand ({dropIndexes : 'foo ' ,index  :   '*‘})
    如果是删除集合中所有的文档(remove)则不会影响索引,当有新文档插入时,索引就会重建。

4.唯一索引

创建唯一索引,同时这也是一个符合唯一索引 
    db.things.ensureIndex (
    {
        'firstName ' :   1 ,
        'lastName ' :   1
    },   {
    指定为唯一索引
    'unique ' :   true ,
    删除重复 记录
    'dropDups ' :   true
    });

5、强制使用索引

强制使用索引 a 和 b
    db.collection.find ({
        'a ' :   4 ,
        'b ' :   5 ,
        'c ' :   6
    }). hint ({
        'a ' :   1 ,
        'b ' :   1
    });
    强制不使用任何 索引
    db.collection.find ().hint ({
        '$ natural' :   1
    });

索引总结:

  1. 索引可以加速查询;
  2. 单个索引无需在意其索引方向;
  3. 多键索引需要慎重考虑每个索引的方向;
  4. 做海量数据更新时应当先卸载所有索引,待数据更新完成后再重建索引;
  5. 不要试图为每个键都创建索引,应考虑实际需要,并不是索引越多越好;
  6. 唯一索引可以用来消除重复记录;
  7. 地理空间索引是没有单位的,其内部实现是基本的勾股定理算法
(0)

相关推荐

  • MongoDB最基本命令速查笔记

    安装后在控制台输入: mongo启动客户端. show dbs显示所有数据库. use xxx选中数据库为当前使用的数据库. show collections显示当前数据库的所有集合. db.colleciton.find()来查找表格的所有数据. db.serverStatus()查看数据库服务器的状态. db.stats()查询指定数据库的统计信息. use xxx如果数据库不存在则创建数据库(必须在虽然插入一条数据) db.storeCollection.insert({'version'

  • PHP中安装使用mongodb数据库

    传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无规则数据的存储时,传统关系型数据库建表时对不同字段的处理也显得有些乏力,mongo应运而生,而且ajax技术的广泛应用,json格式的广泛接受,也使得mongo更贴近开发人员. mongo简介及应用场景 MongoDB是一个面向文档的非关系型数据库(NoSQL),使用json格式存储.Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象.Mongo DB最大的优

  • python&MongoDB爬取图书馆借阅记录

    直接上需求和代码 首先是需要爬取的链接和网页:http://211.81.31.34/uhtbin/cgisirsi/x/0/0/57/49?user_id=LIBSCI_ENGI&password=LIBSC 登陆进去之后进入我的账号--借阅.预约及申请记录--借阅历史就可以看到所要爬取的内容 然后将借阅历史中的题名.著者.借阅日期.归还日期.索书号存入Mongodb数据库中,以上便是这次爬虫的需求. 下面开始: 各软件版本为: python 2.7.11 MongoDb 3.2.1 Pych

  • Mongodb 删除添加分片与非分片表维护

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.如何移除分片 1.确认balancer已经开启 mongos> sh.getBalancerState() true 2.移除分片 注:在admin db下执行命令. mongos> use admin switched to db admin mon

  • 在Mac OS上安装使用MongoDB的教程

    概念 MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB 工作在收集和文件的概念. 什么是NoSql? NoSql,全称是 Not Only Sql,指的是非关系型的数据库.下一代数据库主要解决几个要点:非关系型的.分布式的.开源的.水平可扩展的.原始的目的是为了大规模web应用,这场运动开始于2009年初,通常特性应用如:模式自由.支持简易复制.简单的API.最终的一致性(非ACID).大容量数据等.NoSQL被我们用得最多的当数key-va

  • Mongodb 数据类型及Mongoose常用CURD

    前言 看完了Node.js实战,其中在数据存储部分提到了Redis.Mongodb,我自己也根据书中的介绍写了几个简单的demo,在demo的过程首先遇到的问题就是数据类型和常见的CURD写法. mongodb的常见操作有两种方式,一个是直接使用API,也就相当于你在SQL Server客户端中使用T-SQL编写SQL语句来操作数据一样,其次就是在程序中使用mongoose驱动来操作数据,相当于我们在程序里用ADO.NET或EF来操作数据,如果你已经写了几个调用API的demo,那么我建议再回过

  • MongoDB索引使用详解

    索引就像书的目录,如果查找某内容在没有目录的帮助下,只能全篇查找翻阅,这导致效率非常的低下:如果在借助目录情况下,就能很快的定位具体内容所在区域,效率会直线提高. 索引简介 首先打开命令行,输入mongo.默认mongodb会连接名为test的数据库. ➜ ~ mongo MongoDB shell version: 2.4.9 connecting to: test > show collections > 可以使用show collections/tables查看数据库为空. 然后在mon

  • 关于mongoose连接mongodb重复访问报错的解决办法

    具体代码如下所示: var express = require('express'); var mongoose = require('mongoose'); var router = express.Router(); var Person = mongoose.model('Person',{ id:Number, name:String }); /*新增*/ router.get('/insert', function(req, res){ var student = new Person

  • Ubuntu系统中安装MongoDB及其启动命令mongod的教程

    UBuntu上安装MongoDB server 获取最新版本 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz 解压缩即可执行 tar zxvf mongodb-linux-x86_64-2.0.2.tgz cd /usr/mongodb-linux-x86_64-2.0.2/bin 但是在运行前,需要创建mongodb需要的存放数据和日志的目录: sudo mkdir -p /data/db/journal

  • java实现mongodb的数据库连接池

    MongoDB是介于关系数据库和非关系数据库之间的一种产品,文件的存储格式为BSON(一种JSON的扩展),这里就主要介绍Java通过使用mongo-2.7.3.jar包实现mongodb连接池,具体的java代码实现如下: 数据库连接池配置参数: /** *@Description: mongo连接池配置文件 */ package cn.lulei.mongo.pool; public class MongoConfig { private static String userName;//用

随机推荐