mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。

    安装及使用:

    首先在Ubuntu上安装MongoDB。

    下载MongoDB, 现在最新的生产版本1.7.0

    1. 解压文件.

    $ tar -xvf mongodb-linux-i686-1.4.3.tgz

    2. 为MongoDB创建数据目录,默认情况下它将数据存储在/data/db

    $ sudo mkdir -p /data/db/

    $ sudo chown `id -u` /data/db

    3. 启动MongoDB服务.

    $ cd mongodb-linux-i686-1.4.3/bin

    $ ./mongod

    4. 打开另一个终端,并确保你在MongoDB的bin目录,输入如下命令.

    $ ./mongo

    一些概念

    一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。

    BSON

    BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。

    BSON被比作二进制的交换格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。

    BSON有以下三个特点:

    1. 轻量级

    2. 跨平台

    3. 效率高

    命名空间

    MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。

    索引

    mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。

    shell操作数据库:

    1. 超级用户相关:

    1. #进入数据库admin

    use admin

    2. #增加或修改用户密码

    db.addUser('name','pwd')

    3. #查看用户列表

    db.system.users.find()

    4. #用户认证

    db.auth('name','pwd')

    5. #删除用户

    db.removeUser('name')

    6. #查看所有用户

    show users

    7. #查看所有数据库

    show dbs

    8. #查看所有的collection

    show collections

    9. #查看各collection的状态

    db.printCollectionStats()

    10. #查看主从复制状态

    db.printReplicationInfo()

    11. #修复数据库

    db.repairDatabase()

    12. #设置记录profiling,0=off 1=slow 2=all

    db.setProfilingLevel(1)

    13. #查看profiling

    show profile

    14. #拷贝数据库

    db.copyDatabase('mail_addr','mail_addr_tmp')

    15. #删除collection

    db.mail_addr.drop()

    16. #删除当前的数据库

    db.dropDatabase()

    2. 增删改

    1. #存储嵌套的对象

    db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

    2. #存储数组对象

    db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})

    3. #根据query条件修改,如果不存在则插入,允许修改多条记录

    db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

    4. #删除yy=5的记录

    db.foo.remove({'yy':5})

    5. #删除所有的记录

    db.foo.remove()

    3. 索引

    1. #增加索引:1(ascending),-1(descending)

    2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

    3. #索引子对象

    4. db.user_addr.ensureIndex({'Al.Em': 1})

    5. #查看索引信息

    6. db.foo.getIndexes()

    7. db.foo.getIndexKeys()

    8. #根据索引名删除索引

    9. db.user_addr.dropIndex('Al.Em_1')

    4. 查询

    1. #查找所有

    2. db.foo.find()

    3. #查找一条记录

    4. db.foo.findOne()

    5. #根据条件检索10条记录

    6. db.foo.find({'msg':'Hello 1'}).limit(10)

    7. #sort排序

    8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})

    9. db.deliver_status.find().sort({'Ct':-1}).limit(1)

    10. #count操作

    11. db.user_addr.count()

    12. #distinct操作,查询指定列,去重复

    13. db.foo.distinct('msg')

    14. #”>=”操作

    15. db.foo.find({"timestamp": {"$gte" : 2}})

    16. #子对象的查找

    17. db.foo.find({'address.city':'beijing'})

    5. 管理

    1. #查看collection数据的大小

    2. db.deliver_status.dataSize()

    3. #查看colleciont状态

    4. db.deliver_status.stats()

    5. #查询所有索引的大小

    6. db.deliver_status.totalIndexSize()

    5. advanced queries:高级查询

    条件操作符
    $gt : > 
    $lt : < 
    $gte: >= 
    $lte: <= 
    $ne : !=、<> 
    $in : in 
    $nin: not in 
    $all: all 
    $not: 反匹配(1.3.3及以上版本) 
    查询 name <> "bruce" and age >= 18 的数据
    db.users.find({name: {$ne: "bruce"}, age: {$gte: 18}}); 
    查询 creation_date > '2010-01-01' and creation_date <= '2010-12-31' 的数据
    db.users.find({creation_date:{$gt:new Date(2010,0,1), $lte:new Date(2010,11,31)}); 
    查询 age in (20,22,24,26) 的数据
    db.users.find({age: {$in: [20,22,24,26]}}); 
    查询 age取模10等于0 的数据
    db.users.find('this.age % 10 == 0'); 
    或者
    db.users.find({age : {$mod : [10, 0]}}); 
    匹配所有
    db.users.find({favorite_number : {$all : [6, 8]}}); 
    可以查询出{name: 'David', age: 26, favorite_number: [ 6, 8, 9 ] } 
    可以不查询出{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] } 
    查询不匹配name=B*带头的记录
    db.users.find({name: {$not: /^B.*/}}); 
    查询 age取模10不等于0 的数据
    db.users.find({age : {$not: {$mod : [10, 0]}}}); 
    #返回部分字段
    选择返回age和_id字段(_id字段总是会被返回) 
    db.users.find({}, {age:1}); 
    db.users.find({}, {age:3}); 
    db.users.find({}, {age:true}); 
    db.users.find({ name : "bruce" }, {age:1}); 
    0为false, 非0为true 
    选择返回age、address和_id字段
    db.users.find({ name : "bruce" }, {age:1, address:1}); 
    排除返回age、address和_id字段
    db.users.find({}, {age:0, address:false}); 
    db.users.find({ name : "bruce" }, {age:0, address:false}); 
    数组元素个数判断
    对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录
    匹配db.users.find({favorite_number: {$size: 3}}); 
    不匹配db.users.find({favorite_number: {$size: 2}}); 
    $exists判断字段是否存在
    查询所有存在name字段的记录
    db.users.find({name: {$exists: true}}); 
    查询所有不存在phone字段的记录
    db.users.find({phone: {$exists: false}}); 
    $type判断字段类型
    查询所有name字段是字符类型的
    db.users.find({name: {$type: 2}}); 
    查询所有age字段是整型的
    db.users.find({age: {$type: 16}}); 
    对于字符字段,可以使用正则表达式
    查询以字母b或者B带头的所有记录
    db.users.find({name: /^b.*/i}); 
    $elemMatch(1.3.1及以上版本) 
    为数组的字段中匹配其中某个元素
    Javascript查询和$where查询
    查询 age > 18 的记录,以下查询都一样
    db.users.find({age: {$gt: 18}}); 
    db.users.find({$where: "this.age > 18"}); 
    db.users.find("this.age > 18"); 
    f = function() {return this.age > 18} db.users.find(f); 
    排序sort() 
    以年龄升序asc 
    db.users.find().sort({age: 1}); 
    以年龄降序desc 
    db.users.find().sort({age: -1}); 
    限制返回记录数量limit() 
    返回5条记录
    db.users.find().limit(5); 
    返回3条记录并打印信息
    db.users.find().limit(3).forEach(function(user) {print('my age is ' + user.age)}); 
    结果
    my age is 18 
    my age is 19 
    my age is 20 
    限制返回记录的开始点skip() 
    从第3条记录开始,返回5条记录(limit 3, 5) 
    db.users.find().skip(3).limit(5); 
    查询记录条数count() 
    db.users.find().count(); 
    db.users.find({age:18}).count(); 
    以下返回的不是5,而是user表中所有的记录数量
    db.users.find().skip(10).limit(5).count(); 
    如果要返回限制之后的记录数量,要使用count(true)或者count(非0) 
    db.users.find().skip(10).limit(5).count(true); 
    分组group() 
    假设test表只有以下一条数据
    { domain: "www.mongodb.org" 
    , invoked_at: {d:"2009-11-03", t:"17:14:05"} 
    , response_time: 0.05 
    , http_action: "GET /display/DOCS/Aggregation" 

    使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count; 
    db.test.group( 
    { cond: {"invoked_at.d": {$gt: "2009-11", $lt: "2009-12"}} 
    , key: {http_action: true} 
    , initial: {count: 0, total_time:0} 
    , reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time } 
    , finalize: function(out){ out.avg_time = out.total_time / out.count } 
    } ); 


    "http_action" : "GET /display/DOCS/Aggregation", 
    "count" : 1, 
    "total_time" : 0.05, 
    "avg_time" : 0.05 

    ]

  1.                                                                         

                                          

        

  

MongoDb 创建、更新以及删除文档常用命令的更多相关文章

  1. Mongodb 笔记02 创建、更新和删除文档

    创建.更新和删除文档          1. 插入并保存: 1). 单条插入,insert : db.foo.insert({"bar":"baz"}) 2). ...

  2. MongoDB学习笔记二:创建、更新及删除文档

    插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...

  3. MongoDB学习笔记-创建、更新、删除文档

    创建     MongoDB中使用insert方法来向集合插入文档,然后保存到MongoDB中.     db.foo.insert({"hehe":"呵呵"} ...

  4. 创建、更新、删除文档。 --- Mongodb权威指南阅读。

    插入文档: db.foo.insert({ "key" : "value"}); 使用insert插入一个数据,文档中如果没有_id 会自动给文档增加_id. ...

  5. Elasticsearch 创建、更新、删除文档、处理冲突

    ----创建新文档---- 1._index,_type和_id的组合可以唯一标识一个文档,所以确保一个新文档的最简单的办法就是,使用索引请求的POST形式让elsticsearch自动生成唯一_id ...

  6. Elasticsearch 索引、更新、删除文档

    一.Elasticsearch 索引(新建)一个文档的命令: curl XPUT ' http://localhost:9200/test_es_order_index/test_es_order_t ...

  7. 详细描述一下 Elasticsearch 更新和删除文档的过程?

    1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不 能被删除或者改动以展示其变更: 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真 ...

  8. 《mongoDB》基本操作-创建/更新/删除文档

    一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo -  use db_name; 选择你要操作的集合 > use demo switched to db dem ...

  9. MongoDB(二)创建更新删除文档

    插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz" ...

随机推荐

  1. IIS8 添加配置 WCF服务

    今天在Windows8.1 操作系统部署了半天的WCF 一直老是在报错.在这里做个记录 防止下次忘记 在网上查了半天.终于知道原来IIS8不支持WCF服务SVC的请求.所以必须要给IIS8添加WCF服 ...

  2. csharp: .NET Object Relationional Mapper (ORM)- SubSonic

    https://github.com/subsonic/SubSonic-3.0 http://subsonic.codeplex.com/ https://code.google.com/archi ...

  3. Android Studio实现APK的更新、下载、安装

    先不讲那么多看效果图: 下面来讲解一些更新CODE,原理大家都知道,不废话,直接上代码.里面有一些是我自己做的测试例子,所以大家可以直接删掉就好了 第一个:activity_main.xml < ...

  4. Spring容器深入(li)

    spring中最常用的控制反转和面向切面编程. 一.IOC IoC(Inversion of Control,控制倒转).对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的 ...

  5. 云巴:基于MQTT协议的实时通信编程模型

    概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...

  6. Linux Cmd Tool 系列之—history & search command history

    History cmd is for list Bash's log of the historical cmd you typed 1. List last n commands history n ...

  7. PowerDesigner16 基本使用教程

    一.基本概念 概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充. 它从用户的观点出发对信息进行建模,主要用于数据库的概念 ...

  8. jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)

    上一篇记录了BaiduTemplate模板引擎使用示例附源码,在此基础上对使用方法进行了封装 自定义插件jajaxrefresh.js 代码如下: //闭包限定命名空间 (function ($) { ...

  9. TouchDevelop [Mobile App]

    TouchDevelop是一个全新的Windows Phone软件开发环境,是第一个可以使用手机编程的应用. 所用语言看上去有点像BASIC,也有Scratch和AppInventor那样的色块拖拽环 ...

  10. How To Collect ULS Log from SharePoint Farm

    We can use below command to collect SharePoint ULS log from all servers in the Farm in PowerShell. M ...