MongoDB常用操作

一、基本介绍

1. 简介

开源的基于分布式的,面向文档存储的非关系型数据库,文件存储格式为BSON(二进制的json)

  • 分布式数据库系统:对于客户端来说属于黑盒,客户端不关心数据存放在数据库系统中的哪个节点。在这里插入图片描述

  • 面向文档

    • 文档:json键值对,对应关系型数据库的一行(一条记录,列名+数值)

    • 集合:文档的集合,对应关系型数据库的表(多行的集合)

特点

  1. 非关系型数据库,且最像关系型
  2. 跨平台
  3. 高性能,容易使用和部署

mongodb组织结构:库-集合

2. 与MySQL区别

关系型数据库

  1. 表之间有关系(通过外键)
  2. 表数据的存储是由行和列固定组成的
  3. 支持事务,因此对事务要求比较严格的场景(如银行)无法使用mongodb
在这里插入图片描述

二、操作库

登陆方式

默认连接到test库,若test库不存在也可以连接或切换或创建成功,若对新的库不做操作,默认不会保留该库

mongod	#启动mongodb服务器方式

#登录方式
mongo	#默认登录方式
mongo localhost:27017	#指定ip和端口登录
mongo localhost:27017/mydb1	#指定ip和端口登录和库

库的操作

show dbs	--显示库
use mydb1	--切换库
db/db.getname()		--查看当前库名
show tables/collections	--显示库中的表
db.dropDatabase();	--删除库
exit		--退出库

三、操作文档

1. 插入文档

--像db数据库的tab1集合中插入数据
db.tab1.insert({id:1, name:'aa'});	--插入一条数据			
db.tab1.insert({id:2, 'name':'bb'});	--键的引号无所谓
db.tab1.insert({id:3, name:'cc', info:['cc', 'cc']});	--值可以是数组
db.tab1.insert({id:3, name:'dd', info:{like:'dd', love:'dd'}});	--可以内嵌文档
db.tab1.insert({_id:'abc'id:3, name:'dd', info:{like:'dd', love:'dd'}});--可以自定义主键

--批量插入数据
db.tab1.find().forEach(function(x){db.tab2.insert(x)});--讲tab1中的文档批量复制到tab2中,若重复操作不会产生两份(因为存在_id)

--save与insert区别在于:save插入的主键若重复,相当于update数据;而insert会报错
db.tab1.save({_id:'abc'id:3, name:'dd', info:{like:'dd', love:'dd'}});

2. 查询文档

--查询db库中Barca集合的所有文档
db.Barca.find();	--shell默认显示20条数据
--按名字单条件查询
select * from brc where name='messi';
db.brc.find({name:'messi'});
--多条件查询
select * from brc where age=29 and ps='CB';
db.brc.find({age:29, pos:'CB'});
--比较条件查询:gt、lt、gte、lte、ne
select * from brc where age>25 and pos='CB';
db.brc.find({age:{$gt:25}, pos:'CB'});	--采用内嵌语句
--多条结果只返回一条:findOne
db.brc.findOne({age:{$gt:25}, pos:'CB'});
db.brc.find({age:{$gt:25}, pos:'CB'}).pretty;
--显示文档中指定的字段:key后设1
select name, age, pos from brc;
db.brc.find({}, {name:1, age:1, pos:1});	--第一个大括号代表选中所有文档,默认显示_id,去掉设0
--去重
select distinct(age) from brc;
db.brc.distinct('age');
--显示ldata:[40, 30]中第一个元素大于30的文档
db.brc.find({"ldata.0":{$gt:30}});
--显示or条件
select * from brc where age=24 or age=29;
db.brc.find({$or:[{age:24}, {age:29}]});
--显示in条件
select * from brc where age in (24, 29);
db.brc.find({age:{$in:[24, 29]}});
db.brc.find({age:{$nin:[24, 29]}});	--not in
--显示值为null
select * from brc where pos is null;
db.brc.find({pos:null});	--值为null或不存在都会显示
--排序
select * from brc order by age;
db.brc.find().sort({age:1});	--正序
db.brc.find().sort({age:-1});	--倒序
--显示第11个文档
db.brc.find().skip(10).limit(1);	--skip代表跳过的记录数,limit代表去记录数

3. 修改文档

db.collection.update(
	<update cond>,	--判断条件
	<update data>,	--修改内容
	{
    	upsert:<boolean>,	--若不cond存在是否插入新数据
    	muti:<boolean>,		--是否只修改第一条数据
    	writeConcern:<document>	--报错
    }
);

--修改单值
update brc set pos='MF' where name='aa';
db.brc.update(
    {name:'aa'}, 		--判断条件
    {$set:{pos:'MF'}	--修改内容
);	
--修改多值
update brc set pos='SB', age=25 where name='aa';
db.brc.update(
    {name:'aa'},
    {$set:{pos:'SB', age:25}
);
--修改所有满足条件的多个文档
db.brc.update(
	{age:24},
	{$set:{age:25}},
    {upsert:false, multi:true}
);
--若判断条件不满足则新增一条文档
db.brc.update(
    {age:26},
    {$set:{name:'bb'}},
    {upsert:true, multi:true}
);
--若不是用$set,则update语句会直接修改内容作为新值覆盖原值
db.brc.update({name:'aa'}, {age:20});	--新文档将没有name字段,只有_id和age

4. 删除文档

db.collection.remove(
	<query>,
    {
    	justOne:<boolean>,	--默认false,即全删
    	writeConcern:<document>
    }
);
--默认删除
delete from brc where age=25;
db.brc.remove({age:25});
--只删除一个满足条件的文档
db.brc.remove(
	{age:25},
    {justOne:true}
);
--删除集合
db.brc.drop();

在这里插入图片描述

四、索引

时间的获取

Date();	--获取当前日期和时间
ISODate();	--获取标准时间
--设置变量,通过变量获取指定的时间
x=Date();
x.getMonth()

索引

--创建name为升序索引
db.tab1.ensureIndex({name:1});	-- -1为降序索引
--查询是否使用了索引
db.tab1.find({name:'cc'}).explain();	--BtreeCursor代表使用,BasicCursor代表未使用
--索引的删除
db.tab1.dropIndex({name:1});

聚合函数group by

--求各个位置最大/平均/总数年龄
select pos, max/avg/sum(age) from brc group by pos;
db.brc.aggregate({$group:{id:"$pos", maxage:{$max/avg/sum:"$age"}}});
--求各个位置的人数
select pos, count(*) from brc group by pos;
db.brc.aggregate({$group:{_id:"$pos", cnt:{$sum:1}}});
--求不同位置不同年龄的人数
select pos, age, count(*) from brc group by pos, age;
db.brc.aggregate({$group:{_id:{pod:"$pos", age:"$age"}, cnt{$sum:1}}});	--将谁分组就将谁设为主键,多个分组就内嵌联合主键

五、API

1. 常用API

API主要是dbclientinterface.h 头文件中的接口

IN表示输入参数

OUT表示输出参数

  1. 构造函数

    DBClientConnection(bool auto_connect, 0, double so_timeout);
    //auto_connect(IN):连接失败后是否自动重连
    //so_timeout(IN):非礼啊杰超时,tcp的读写超时
    
  2. 连接函数

    bool connect(string server, &string errmsg);
    //返回值:成功/失败
    //server(IN):服务器地址
    //errmsg(out):出错信息
    
  3. 查询函数

    auto_ptr query(const string &ns, Query query, int nToReturn, int nToSkip,
    const BSONObj *fieldsToReturn, int queryOptions , int batchSize);
    //返回值:结果集
    //ns(IN):命名空间,db_name.collection_name
    //query(IN):查询的条件,相当于mysql中的where
    //nToReturn:返回结果条数,相当于limit
    //nToSkip:跳过的结果条数,相当于skip
    //fieldsToReturn:返回列集合
    //queryOptions:详见QueryOptions这个枚举,填0即可
    //batchSize:未说明
    
    
  4. 插入函数

    void insert(const string &ns, BSONObj obj, int flags);
    //ns(IN):命名空间,db_name.collection_name
    //obj(IN):插入的列
    //flags(IN):详见API文档,默认填零即可
    
  5. 删除函数

    void remove(const string &ns, Query query, bool justOne);
    //ns(IN):命名空间,db_name.collection_name
    //query(IN):查询条件
    //justOne(IN):是否只删除匹配的第一条
    
    
  6. 修改函数

    void update(const string &ns , Query query , BSONObj obj , bool upser , bool multi);
    //ns(IN):命名空间,db_name.collection_name
    //query(IN):查询条件
    //obj(IN):修改后的值
    //upser(IN):是否upser,如果不存在则插入记录
    //multi(IN):是否为符合文档
    
    

2. 程序示例

//1.创建连接对象
DBClientConnection *pDBCC = new DBClientConnection(true, 0, 10);

//2.连接到数据库
pDBCC->connect( "127.0.0.1"+":" + 27017, "");

//3.查询数据	 select uid,name from shool.student where age=20 limit 5,10;
Query condition = QUERY("age"<<20);
BSONObj columns = BSON("uid"<<1<<"name"<<1);
cursor = pConn->query("shool"+"."+"student", condition, 10, 5, columns, 0, 0);
	//查看结果
	int uid = 0; name = "";
    while(cursor->more())
    {
        BSONObj p = cursor->next();
        uid = p["uid"].Int();
        name = p["name"].String();
        count << uid << " " << name << endl;
    }

//4.插入数据	insert into shool.student (uid, name) values (10001, “skean1017″);
BSONObj _insert = BSON("uid"<<10001<<"name"<<"skean1017"); 
pConn->insert(db+"."+collection, _insert, 0);

//5.修改数据	update shool.student set name=”habadog1203” where uid=10001;
Query query = QUERY("uid"<<10001);
BSONObj obj = BSON("$set"<update(db+"."+collection, query, obj, false, false);

//6.删除数据	delete from shool.student where name=”skean1017″;
Query query = QUERY("name"<<"skean1017"); 
pConn->remove(db+"."+collection, query, true);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值