Mongo基本操作

核心概念

mongodb中的库就类似于传统关系型数据库中库的概念,用来通过不同库隔离不同应用数据。默认的数据库为"test",数据库存储在启动指定的data目录

集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表的概念

集合存在于数据库中,一个库中可以创建多个集合。每个集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

文档

文档集合中一条条记录,是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:

{"site":"www.baizhiedu.xin", "name":"编程不良人"}

MySQL与MongoDB关系总结

RDBMSMongoDB
数据库数据库
集合
文档
字段

基本操作

  • 查看所有库

> show databases; | show dbs;

注意:

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
  • 创建数据库
> use 库名

注意: use 代表创建并使用,当库中没有数据时默认不显示这个库

  • 删除数据库

    • 默认删除当前选中的库
> db.dropDatabase()
  • 查看当前所在库
> db;

集合

  • 查看库中所有集合
> show collections; | show tables;
  • 创建集合
> db.createCollection('集合名称', [options])
  • 删除集合
> db.集合名称.drop();

文档

  • 插入 文档

    • 单条 文档
    > db.集合名称.insert({"name":"编程","age":23,"bir":"2012-12-12"});
    
    • 多条文档
    > db.集合名称.insert([
    {"name":"不良","age":23,"bir":"2012-12-12"},
    {"name":"小黑","age":25,"bir":"2012-12-12"}
    ]);
    

注意:在 mongodb 中每个文档 都会有一个 _id 作为唯一标识,_id 默认会自动生成如果手动指定将使用手动指定的值作为_id 的值。

  • 查询 所有
> db.集合名称.find();
  • 删除文档
db.集合名称.remove(
	<query>,
	{
	justOne: <boolean>,
	writeConcern: <document>
	}
)

文档查询

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

> db.集合名称.find().pretty()

注意: pretty() 方法以格式化的方式来显示所有文档。

AND

> db.集合名称.find({key1:value1, key2:value2,...}).pretty()

类似于 WHERE 语句:WHERE key1=value1 AND key2=value2

OR

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

> db.集合名称.find(
  {
     $or: [
        {key1: value1}, {key2:value2}
     ]
  }
).pretty()

类似于 WHERE 语句:WHERE key1=value1 or key2=value2

AND 和 OR 联合

类似SQL语句为:'where age >50 AND (name = '编程人' OR name = 'MongoDB')'

> db.集合名称.find({"age": {$gt:50}, $or: [{"name": "编程人"},{"name": "MongoDB"}]}).pretty();

模糊查询

类似 SQL 中为 'where name like '%name%''

> db.users.find({likes://});

注意:在 mongoDB 中使用正则表达式可以是实现近似模糊查询功能

排序

> db.集合名称.find().sort({name:1,age:1}),
- 1 升序  -1 降序

类似 SQL 语句为: 'order by name,age'

分页

> db.集合名称.find().sort({条件}).skip(start).limit(rows);

类似于 SQL 语句为: 'limit start,rows'

总条数

> db.集合名称.count();
> db.集合名称.find({"name":"编程人"}).count();

类似于 SQL 语句为: 'select count(id) from ....'

去重

> db.集合名称.distinct('字段')

类似于 SQL 语句为: 'select distinct name from ....'

指定返回字段

  • 参数2::1 返回 ;0 不返回 注意:1和0不能同时使用
> db.集合名称.find({条件},{name:1,age:1}) 

索引

操作

0、创建索引

> db.集合名称.createIndex(keys, options)
> db.集合名称.createIndex({"title":1,"description":-1})

说明: 语法中 Key 值为你要创建的索引字段,1 为指定 按升序 创建索引,如果你想 按降序 来创建索引指定为 -1 即可。

1、查看集合索引

> db.集合名称.getIndexes()

2、查看集合索引大小

> db.集合名称.totalIndexSize()

3、删除集合所有索引

> db.集合名称.dropIndexes()

4、删除集合指定索引

> db.集合名称.dropIndex("索引名称")

复合索引

说明: 一个索引的值是由多个 key 进行维护的索引的称之为复合索引

> db.集合名称.createIndex({"title":1,"description":-1})

注意: mongoDB 中复合索引和传统关系型数据库一致都是 最左前缀原则

聚合

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)

db.users.insert([{
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
}])

现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
_id :代表按照 哪个字段分组

> db.集合名称.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

常见聚合表达式
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值