MongoDB—Java/Python

MongoDB介绍

  • 什么是MongoDB
    MongoDB是一个跨平台、面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON的BSON格式,可以存储比较复杂的数据类型。
  • MongoDB特点
    MongoDB最大的特点是它支持的查询语言非常强大,语法类似面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
    • 面向集合存储,易于存储对象类型的数据
    • 模式自由
    • 支持动态查询
    • 支持完全索引,包含内部对象
    • 支持复制和故障恢复
    • 使用高效的二进制数据存储,包括大型对象(如视频等)
    • 自动处理碎片,以支持云计算层次的扩展性
    • 支持多种语言的驱动程序
    • 文件存储格式为BSON
  • MongoDB体系结构
    MongoDB的逻辑结构是一种层次结构:由文档(document)、集合(collection)、数据库(database)组成。逻辑结构是面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。
    • 文档document,相当于关系数据库中的一行记录
    • 多个文档组成一个集合collection,相当于关系数据库的表
    • 多个集合collection,逻辑上组织在一起,就是数据库database
    • 一个mongodb实例支持多个数据库database

Windows安装及启动

  • 安装
    官网下载安装即可。https://www.mongodb.com/
    默认安装在C:\Program Files\MongoDB 目录下。需要启动的服务程序为C:\Program Files\MongoDB\Server\3.2\bin目录下的mongo.exe,可以添加到环境变量path中。
  • 启动服务
    Win+R ——》cmd 进入命令行:
    创建一个用户存放数据的目录:md data\db
    启动服务:mongod --dbpath=D:\MongoDB\data\db
    –dbpath:指定数据存储的目录
    –port:指定端口启动,默认端口27017
    eg:mongod --port 12345 --dbpath=D:\MongoDB\data\db
  • 登录客户端
    重新打开一个命令窗口,输入:mongo [ip:端口号]
    退出命令:exit

基本增删改查操作

  • 选择或创建数据库
    查看全部数据库:show dbs;
    查看当前所在数据库:db;或者db.getName();
    选择数据库(不存在会自动创建):use test1;
    显示数据库操作命令:db.help();
  • 删除当前使用数据库:db.dropDatabase();
  • 删除collection:db.student3.drop();
  • 删除collection中所有记录:db.student3.remove();
  • 插入文档
    定义一个文档变量:变量名称={};
    eg:s={name:‘悟空’,sex:‘男’,age:30,address:‘花果山水帘洞’}
    将变量存入mongo:db.集合名称.save(变量);
    eg:db.student.save(s);
    # 集合不存在,会自动创建
    不定义变量,直接向集合插入数据:
    eg:db.student.save({name:‘八戒’,sex:‘男’,age:35,address:‘高老庄’});
    测试数据:
    db.student.save({name:“沙和尚”,sex:“男”,age:25,address:“流沙河路”});
    db.student.save({name:“唐僧”,sex:“男”,age:35,address:“东土大唐”});
    db.student.save({name:“白骨精”,sex:“女”,age:18,address:“白骨洞”});
    db.student.save({name:“白龙马”,sex:“男”,age:20,address:“西海”});
    db.student.save({name:“哪吒”,sex:“男”,age:15,address:“莲花湾”});
  • 查询集合
    显示当前数据库中的集合:show collections;
    显示集合操作命令:db.集合名.help();
    查询集合数据:db.集合名称.find()
    query-all
    字段_id,相当于关系型数据库中表的主键,插入文档时若没有指定,MongoDB会自动创建,类型为ObjectID。
    插入文档时也可以指定_id,类型只要MongoDB支持即可。
    eg:db.student.save({_id:1,name:“红孩儿”,sex:“男”,age:17,address:“火云洞”});
    条件查询
    为了避免游标可能带来的开销,MongoDB提供了findOne()方法,用来返回结果集的第一条记录。eg:db.student.findOne({sex:‘男’});
    返回查询结果的前几条记录:db.student.find({sex:‘男’}).limit(3);
  • 修改文档
    db.student.update({name:‘悟空’},{age:31});
    查询
    、# 查询发现悟空的文档只剩下_id和age两个字段了。。。
    保留其他字段更新:db.student.update({name:‘八戒’},{$set:{age:28}});
  • 删除文档
    格式:db.集合名称.remove(条件);
    # remove({}),慎用,会删除集合所有文档
    eg:db.student.remove({name:‘哪吒’});

高级查询

  • 模糊查询
    MongoDB的模糊查询是通过正则表达式的方式实现的。
    eg1:查询student集合中address字段中含有“洞”的所有文档
    db.student.find({address:/洞/});
    eg2:查询name字段中以“白”开头的
    db.student.find({name:/^白/});
  • Null值处理
    db.student.update({name:‘唐僧’},{$set:{address:null}});
    db.student.find({“address”:null});
    空值查询
    该方式查询会查询出该字段为null以及不存在该字段的文档记录。
  • 大于小于
    格式:db.collection.find({“field”: {$gt: value}});
    • 大于:$gt
    • 小于:$lt
    • 大于等于:$gte
    • 小于等于:$lte
      eg:db.student.find({age: {$gte: 20}});
  • 不等于:$ne
    eg:db.student.find({sex: {$ne: “男”}});
  • 判断字段是否存在:$exists
    eg1:db.student.find({address: {$exists: true}});
    eg1:db.student.find({address: {$exists: false}});
  • 包含与不包含:$in
    eg1:db.student.find({age: {$in: [20,25,30]}});
    eg2:db.student.find({age: {$nin: [20,25,30]}});
  • 统计记录条数:count()
    eg1:db.student.count();
    eg1:db.student.count({age: {$lte: 20}});
  • 条件连接—并且:$and
    格式:$and: [{}, {}]
    eg:db.student.find({$and: [{age: {$gte: 20}}, {age: {$lt: 30}}]});
  • 条件连接—或者:$or
    格式:$or: [{}, {}]
    eg:db.student.find({$or: [{sex: “女”}, {age: {$lt: 20}}]});

Java连接MongoDB

  • 依赖包:
<dependency>
	<groupId>org.mongodb</groupId>
	<artifactId>mongodb-driver</artifactId>
	<version>3.4.1</version>
</dependency>
  • 查询文档
    • MongoDB的数字类型默认使用64位浮点型数值,{x: 3.14}或{x: 3}。对于整型值,可以使用Numberint(4字节符号整数),{x: NumberInt(3)}或NumberLong(8字节符号整数){x: NumberLong(3)}
    • MongoDB使用BasicDBObject类型封装查询条件
    • 模糊查询
      • 完全匹配:Pattern pattern = Pattern.compile("^name$");
      • 右匹配:Pattern pattern = Pattern.compile("^.*name$");
      • 左匹配:Pattern pattern = Pattern.compile("^name.*$");
      • 模糊匹配:Pattern pattern = Pattern.compile("^.*name.*$");
// 遍历student集合所有数据:
MongoClient client = new MongoClient("127.0.0.1",27017);
MongoDatabase database = client.getDatabase("test1");
	MongoCollection<Document> collection = database.getCollection("student");
	FindIterable<Document> list = collection.find();
	for (Document document : list) {
		System.out.println("name="+document.getString("name"));
		System.out.println("sex="+document.getString("sex"));
		System.out.println("age="+document.getDouble("age"));
		System.out.println("address="+document.getString("address"));
		System.out.println("-----------------------");
	}
// 匹配查询
BasicDBObject bson = new BasicDBObject("name", "八戒");
FindIterable<Document> list = collection.find(bson);
// 模糊查询
Pattern pattern = Pattern.compile("^白.*$");
BasicDBObject bson = new BasicDBObject("name", pattern);
FindIterable<Document> list = collection.find(bson);
//大于小于
BasicDBObject bson = new BasicDBObject("age", new BasicDBObject("$lt", 20));
// 条件连接—并且
BasicDBObject bson1 = new BasicDBObject("age", new BasicDBObject("$gte", 20));
BasicDBObject bson2 = new BasicDBObject("age", new BasicDBObject("$lt", 30));
BasicDBObject bson = new BasicDBObject("$and",Arrays.asList(bson1,bson2));
//条件连接—或者
BasicDBObject bson1 = new BasicDBObject("age", new BasicDBObject("$gte", 20));
BasicDBObject bson2 = new BasicDBObject("sex", "女");
BasicDBObject bson = new BasicDBObject("$or",Arrays.asList(bson1,bson2));
  • 增加文档
Map<String, Object> map = new HashMap();
map.put("name", "铁扇公主");
map.put("sex", "女");
map.put("age", 35.0);
map.put("address", "芭蕉洞");
Document doc = new Document(map);
collection.insertOne(doc);// 插入一条记录
// collection.insertMany(documents);//一次性插入多条文档
  • 删除文档
BasicDBObject bson=new BasicDBObject("name", "铁扇公主");
collection.deleteOne(bson);//删除记录(符合条件的第一条记录)
//collection.deleteMany(bson);//删除符合条件的全部记录
  • 修改文档
//修改的条件
BasicDBObject bson= new BasicDBObject("name", "红孩儿");
//修改后的值
BasicDBObject bson2 = new BasicDBObject("$set",new BasicDBObject("address", "南海"));
//参数1:修改条件  参数2:修改后的值,updateOne修改符合条件的第一条记录
collection.updateOne(bson, bson2);
//collection.updateMany(filter, update);//修改符合条件的所有记录

MongoDB连接池

  • MongoClient被设计为线程安全的类,在使用时不需要考虑并发情况。可以把MongoClient做成一个静态变量,为所有线程公用,不必每次都销毁。这样可以极大提高执行效率。实际上,这是MongoDB提供的内置的连接池来实现的。
public class MongoManager {

	private static MongoClient mongoClient = null;
	
	//初始化mongoClient
	private static void init() {
		Builder builder = new MongoClientOptions.Builder();
		builder.connectTimeout(5000);//设置连接超时时间
		builder.socketTimeout(5000);//读取数据的超时时间
		builder.connectionsPerHost(30);//每个地址最大请求数		
		builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常
		MongoClientOptions options = builder.build();
		mongoClient = new MongoClient(new ServerAddress("127.0.0.1", 27017),options);
	}
	
	public static MongoDatabase getDataBase() {
		if(mongoClient == null) {
			init();
		}
		return mongoClient.getDatabase("test1");
	}
}
  • 写入策略
    WriteConcern.NONE:没有异常抛出
    WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
    WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
    WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
    WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
    WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
    WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

Python连接MongoDB

# -*- coding: utf-8 -*-
# @Time     :2018/12/9 22:11
# @File     :testMongo.py
from pymongo import MongoClient

client = MongoClient("127.0.0.1", 27017)
collection = client["test1"]["student"]

def insertData():
    ret = collection.insert([{"name": "test01", "age": 33}, {"name": "test02", "age": 35}])
    print ret

def insertOne():
    ret = collection.insert_one({"name": "test03", "age": 36})
    print ret

def insertMany():
    dict_list = [{"name": "test04", "age": 23}, {"name": "test05", "age": 25}]
    collection.insert_many(dict_list)

def findOne():
    ret = collection.find_one({"name": "八戒"})
    print ret

def findAll():
    ret = collection.find({})
    for i in ret:
        print "ret",i
    for i in ret: # 结果是一个Cursor游标对象,此时没有结果
        print "ret2",i

if __name__ == '__main__':
    # findOne()
    findAll()
    # 增删改查类似
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水资源是人类社会的宝贵财富,在生活、工农业生产中是不可缺少的。随着世界人口的增长及工农业生产的发展,需水量也在日益增长,水已经变得比以往任何时候都要珍贵。但是,由于人类的生产和生活,导致水体的污染,水质恶化,使有限的水资源更加紧张。长期以来,油类物质(石油类物质和动植物油)一直是水和土壤中的重要污染源。它不仅对人的身体健康带来极大危害,而且使水质恶化,严重破坏水体生态平衡。因此各国都加强了油类物质对水体和土壤的污染的治理。对于水中油含量的检测,我国处于落后阶段,与国际先进水平存在差距,所以难以满足当今技术水平的要求。为了取得具有代表性的正确数据,使分析数据具有与现代测试技术水平相应的准确性和先进性,不断提高分析成果的可比性和应用效果,检测的方法和仪器是非常重要的。只有保证了这两方面才能保证快速和准确地测量出水中油类污染物含量,以达到保护和治理水污染的目的。开展水中油污染检测方法、技术和检测设备的研究,是提高水污染检测的一条重要措施。通过本课题的研究,探索出一套适合我国国情的水质污染现场检测技术和检测设备,具有广泛的应用前景和科学研究价值。 本课题针对我国水体的油污染,探索一套检测油污染的可行方案和方法,利用非分散红外光度法技术,开发研制具有自主知识产权的适合国情的适于野外便携式的测油仪。利用此仪器,可以检测出被测水样中亚甲基、甲基物质和动植物油脂的污染物含量,为我国众多的环境检测站点监测水体的油污染状况提供依据。
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值