Mongodb的数据库简介、docker部署、操作语句以及java应用
本文主要介绍了mongodb的基础概念和特点,以及基于docker的mongodb部署方法,最后介绍了mongodb的常用数据库操作语句(增删改查等)以及java下的常用语句。
一、基础概念
1、Mongodb简要介绍
MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
2、基础概念
(1)文档field(记录):
“类似json的bson格式,同一张表的数据结构可以不固定,MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。
(2)集合Collection(表):
集合就是一组文档,类似于关系数据库中的表。
可以使用“.”按照命名空间将集合划分为子集合。
(3)数据库DataBase:
中多个文档组成集合,多个集合组成数据库。在磁盘上,不同的数据库存放在不同的文件中.
MongoDB 中存在以下系统数据库。
Admin 数据库、Local 数据库、Config 数据库。
3、与关系型数据库类比
DataBase==> ==> Document ==> field(key/value)
二、特性和应用场景
1、特性
(1)大数据量
(2)高并发(虚拟内存)
(3)数据结构可扩展性:(数据结构不固定)表结构灵活可变,字段类型可以随时修改。
(4)应用不需要事务以及复杂的 join 支持,价值较低的数据,对事务性要求不高
2、应用场景
游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。
物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
视频直播,使用MongoDB存储用户信息、礼物信息等。
三、docker下的mongodb部署
1、部署mongodb
docker search mongo
docker pull mongo:latest
cd /data
mkdir mongo_local_data
docker run --name my_mongo -v /data/mongo_local_data:/data/db --rm -d -p 27017:27017 mongo
docker ps
2、进入mongodb数据库
docker exec -it my_mongo /bin/bash
cd /bin
可见有mongosh
mongosh admin
附:
docker exec -it <容器id> mongo admin 报错如下解决办法
[root@iZ2zehrk49wgv86b2hqvncZ ~]# docker exec -it 67c3f3893ce8 mongo admin
OCI runtime exec failed: exec failed: unable to start container process: exec: "mongo": executable file not found in $PATH: unknown
按如上,先进入容器,再mongosh admin
四、Mongodb的主要操作
1、创建账户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
2、连接数据库
db.auth('root', '123456')
3、创建数据库
use my_mongodb
4、创建集合
db.createCollection('shucai_record')
5、插入数据
db.集合名.insert(JSON数据)
mongodb会给每条数据增加一个全球唯一的_id键
db.getCollection("shucai_record").insert( {
_id: ObjectId("638e8e739320275867030e4c"),
readTimestamp: NumberLong("1670286944653"),
address: "DB14.2",
value: NumberInt("0"),
DeviceId: NumberInt("1368")
} );
db.getCollection("shucai_record").insert( {
_id: ObjectId("638e8e739320275867030e4d"),
readTimestamp: NumberLong("1670286944653"),
address: "DB14.4",
value: NumberInt("0"),
DeviceId: NumberInt("1368")
} );
db.getCollection("shucai_record").insert( {
_id: ObjectId("638e8e739320275867030e4e"),
readTimestamp: NumberLong("1670286944653"),
address: "DB14.6",
value: NumberInt("0"),
DeviceId: NumberInt("1368")
} );
db.getCollection("shucai_record").insert( {
_id: ObjectId("638e8e739320275867030e4f"),
readTimestamp: NumberLong("1670286944653"),
address: "DB14.8",
value: NumberInt("0"),
DeviceId: NumberInt("1368")
} );
db.getCollection("shucai_record").insert( {
_id: ObjectId("638e8e739320275867030e50"),
readTimestamp: NumberLong("1670286944653"),
address: "DB14.10",
value: NumberInt("0"),
DeviceId: NumberInt("1368")
} );
6、查找数据
db.集合名.find({
键:{运算符:值}
})
Eg:
查找设备点位地址为DB14.10和DB14.8的数据:
db.getCollection("shucai_record").find({address:{$in:["DB14.10","DB14.8"]}})
7、修改数据
db.集合名.update(条件,新数据[是否新增,是否修改多条,])
inc递增rename重命名列set修改列值unset删除列
Eg:
(1)设备点位地址为DB14.8的数据,value值加上4:
db.shucai_record.update({address:{$in:["DB14.8"]}},{$inc:{value:4}})
db.getCollection("shucai_record").find({address:{$in:["DB14.10","DB14.8"]}})
(2)设备点位地址为DB14.8的数据,value值改为30(第一个true: 如果没找到DB14.8的数据,则新增,value值为30;第二个true: 如果找到多条,多条进行更新,value值改为30)
db.shucai_record.update({address:{$in:["DB14.10"]}},{$set:{value:30}},true,true)
db.getCollection("shucai_record").find({address:{$in:["DB14.10","DB14.8"]}})
8、删除数据
db.集合名.remove(条件[,是否删除一条])
Eg:删除设备点位地址为DB14.10的数据,(false: 如果找到多条就删除多条)
db.shucai_record.remove({address:{$in:["DB14.10"]}},false)
db.getCollection("shucai_record").find({address:{$in:["DB14.10","DB14.8"]}})
9、删除集合
db.集合名.drop()
10、删除数据库
db.dropDataBase()
11、索引的建立和查看
# 索引建立
db.集合名.ensureIndex({字段名:1(1:升序-1降序)},{name:"索引名"})
# 索引查看
db.集合名.getIndexes()
#索引删除
db.集合名.dropIndex("索引名")
Eg:
db.shucai_record.ensureIndex({readTimestamp:1},{name:"timeIndex"})
db.shucai_record.getIndexes()
db.shucai_record.dropIndex("timeIndex")
Bson filter = Filters.and(Filters.eq("DeviceId", device.getId()), Filters.eq("address", factoryIndexAddress.getParamAddress()), Filters.gte("readTimestamp", beginTimeStamp), Filters.lte("readTimestamp", endTimeStamp));
五、java中的mongodb操作【主要介绍 查询操作】
1、数据库连接及集合选定
String mongoCollection = “shucai_record”
MongoCollection<Document> collection = mongoTemplate.getCollection(mongoCollection);
2、筛选条件
Bson filter = Filters.and(Filters.eq("DeviceId", device.getId()), Filters.eq("address", factoryIndexAddress.getParamAddress()), Filters.gte("readTimestamp", beginTimeStamp), Filters.lte("readTimestamp", endTimeStamp));
3、查找
FindIterable<Document> projection = null;
projection = collection.find(filter).sort(Sorts.descending("readTimestamp"));
4、查找结果的条数
long projectionTotal = collection.countDocuments(filter);
5、查找结果遍历 和 获取查找结果的值
MongoCursor<Document> cursor = projection.iterator();
Document lastData = cursor.next();
String address = lastData.get("address").toString();
while (cursor.hasNext()) {
documentData = cursor.next();
if ((Boolean) documentData.get("value") == false) {
//其他逻辑处理,eg:
continueFlag = false;
}
}