MongoDB的基本使用

来源:互联网 发布:美工电脑是什么意思 编辑:程序博客网 时间:2024/05/16 17:45

基本概念

SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键 # RDBMS MongoDB 服务端 Mysqld/Oracle mongod 客户端 mysql/sqlplus mongo
  • 隐式创建数据库和集合

NoSql:not only sql 非关系型数据库

  • 面向对象式的
    新浪微博:redis
    googlebigtable
    amazon:simpledb
    淘宝:tair
    视觉网站:mongodb
    优酷运营数据分析:mongodb
    飞信空间:handlersocket
    豆瓣社区:beansdb
    • 优点:
      简单的扩展
      快速的读写
      低廉的成本
      灵活的数据模型
    • 缺点:
      只是在局部展现出某些优势
      不提供对sql的支持
      支持的特性不够丰富

现有的产品不够成熟相对成熟的产品 mongodbredis是一个面向集合的,模式自由的文档型数据库

  • 面向集合:
    • 文件存储格式:bson(二进制的json
    • 使用场景:
      持久化的缓存层
      高效的实时性
      用于对象以及json数据的存储
      高伸缩性的场景
      大尺寸,低价值的数据存储
    • 不适用:
      高度事务
      传统的商业智能应用
      复杂的多表查询

查询

MongoDB 查询数据的语法格式如下:

db.collection.find(query, projection)
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
    如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()

返回当前集合数据项的总条数

db.col.find().count()

若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式

db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键

_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)

db.collection.find(query, {title: 1, by: 0}) // 错误

只能全1或全0,除了在inclusion模式时可以指定_id0

db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确

排序

MongoDB中使用使用sort()方法对数据进行排序。
sort()方法可以通过参数指定排序的字段,并使用 1-1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

LimitSkip

  • limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
  • skip方法同样接受一个数字参数作为跳过的记录条数。
  • skiplimit 结合就能实现分页。
  • 当查询时同时使用sort,skip,limit,无论位置先后,最先执行顺序 sortskiplimit
  • skiplimit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据数过去的,建议使用where_limit
    SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高。
    这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:
b.test.sort({"amount":1}).skip(100000).limit(10)  //183msdb.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)  //53ms

实验结果印证了Skip效率差的理论。

更新

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 :可选,抛出异常的级别。

当不使用$set操作符时,update()第二个对象将全部覆盖第一个对象(不包括_id)

// {"_id":2,"x":1,"y":33,"z":98}update({x:1},{y:3})

这样新的集合将会变为{"_id":2,"y":3}

删除

删除文档

remove() 方法已经过时了,现在官方推荐使用 deleteOne()deleteMany() 方法。

  • 如删除集合下全部文档:
db.inventory.deleteMany({})
  • 删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
  • 删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )

删除集合

db.collection.drop()

删除数据库

db.dropDatabase()

显示

显示数据库

show dbs

显示集合

show tablesshow collections

插入

插入文档你也可以使用 db.col.save(document)命令。如果不指定_id字段 save() 方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据。

3.2 版本后还有以下几种语法可用于插入文档:

  • db.collection.insertOne():向指定集合中插入一条文档数据
  • db.collection.insertMany():向指定集合中插入多条文档数据
//  插入单条数据> var document = db.collection.insertOne({"a": 3})> document{        "acknowledged" : true,        "insertedId" : ObjectId("571a218011a82a1d94c02333")}//  插入多条数据> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])> res{        "acknowledged" : true,        "insertedIds" : [                ObjectId("571a22a911a82a1d94c02337"),                ObjectId("571a22a911a82a1d94c02338")        ]}
  • 使用js语法插入多条数据:
for(i=2;i<100;i++)db.test01_collection.insert({x:i})
原创粉丝点击