【Mongodb常规操作 01】
一、简介
1、什么是MongoDB
c++语言编写的,是一个基于分布式文件存储的开源数据库系统;为web应用提供可扩展的高性能数据存储解决方案;
MongoDB将数据存储为一个文档,数据结构由键值对(k-v)组成。MongoDB文档类似于json对象。字段值可以包含其他文档,数组及文档数组
2、安装MongoDB
1)拉取镜像
docker pull mongo:latest
2)创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
3)进入容器
docker exec -it 5bf2ba713cbb /bin/bash
5bf2ba713cbb 容器id
4)使用MongoDB客户端进行操作
mongo
5)查询所有数据库
6)查询所有集合(表)
show collections
二、简单命令操作
1、MongoDB概念
MongoDB中基本的概念是文档、集合、数据库;
下表将帮组您更容易理解mongo中的一些概念
SQL术语/概念 |
MongoDB术语/概念 |
解释/说明 |
database |
database |
数据库 |
table(表) |
collection(集合) |
数据库表/集合 |
row(行) |
document(文档) |
数据记录行/文档 |
column(列) |
field(字段) |
数据字段/域 |
index(索引) |
index(索引) |
索引 |
table joins |
|
表连接,MongoDB不支持 |
primary key |
primary key |
主键,MongoDB自动将_id字段设置为主键 |
2、MongoDB-database(数据库)
一个MongoDB中可以建立多个数据库
常用操作
1、 Help查看命令提示 db.help(); 2、 切换/创建数据库 use test 如果数据库不存在,则创建数据库,否则切换到指定数据库 3、 查询所有数据库 show dbs; 4、 删除当前使用数据库 db.dropDatabase(); 5、 查看当前使用的数据库 db.getName(); 6、 显示当前db状态 db.stats(); 7、 当前db版本 db.version(); 8、 查看当前db的链接机器地址 db.getMongo〇;
9、查看当前库内的所有集合(表)
show collections
3、MongoDB-document(文档)
文档是一组键值(key-value)对(即 BSON),MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongDB非常突出的特点。
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
4、MongoDB-collection(集合)
常用命令:
1、 创建一个集合(table) db.createCollection( "collName"); 2、 得到指定名称的集合(table ) db.getCollection("user");
5、常用命令
1)insert
> db.User.save({name:'zhangsan',age:21,sex:true}) > db.User.find() {"_id": Objectld("4f69e680c9106ee2ec95da66"), "name": "zhangsan", "age": 21, "sex": true} User:代表集合
2)query查询
查询集合下的所有数据
> db.User.find()
where
# select * from User where name = 'zhangsan'
> db.User.find({name:"zhangsan"})
fields
# select name, age from User where age = 21
> db.User.find({age:21}, {'name':1, 'age':1})
sort排序 -->1升序,-1降序
# select * from User order by age > db.User.find().sort({age:1})
suce -->在 MongoDB 中使用 limit()方法来读取指定数量的数据,skip()方法来跳过指定数量的数据
# select * from User skip 2 limit 3
> db.User.find().skip(0).limit(3)
in
# select * from User where age in (21, 26, 32) > db.User.find({age:{$in:[21,26,32]}})
count
# select count(*) from User where age >20
> db.User.find({age:{$gt:20}}).count()
or
# select * from User where age = 21 or age = 28
> db.User.find({$or:[{age:21}, {age:28}]})
3)Update
可直接用类似T-SQL条件表达式更新,或用SaveO更新从数据库返回到文档对象。 # update Userset age = 100, sex = 0 where name = 'user1' > db.User.update({name:"zhangsan"}, {$set:{age:100, sex:0}}) Update()有几个参数需要注意。 db.collection.update(criteria, objNew, upsert, mult) criteria:需要更新的条件表达式 objNew:更新表达式 upsert:如FI标记录不存在,是否插入新文档。 multi:是否更新多个文档。
4)remove
removeO用于删除单个或全部文档,删除后的文档无法恢复。
> db.User.remove(id) //移除对应id的行 > db.User.remove({}) //移除所有
5)aggregate
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)
插入数据
>db.article.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 }) >db.article.insert({ 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 }) >db.article.insert({ title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 })
统计sum
# select by_user, count(*) from article group by by_user > db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "runoob.com", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 }
在上面的例子只能怪,我们通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和
常见聚合表达式
表达式 |
描述 |
实例 |
$sum |
计算总和。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg |
计算平均值 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min |
获取集合中所有文档对应值得最小值。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max |
获取集合中所有文档对应值得最大值。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push |
在结果文档中插入值到一个数组中。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet |
在结果文档中插入值到一个数组中,但不创建副本。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first |
根据资源文档的排序获取第一个文档数据。 |
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last |
根据资源文档的排序获取最后一个文档数据 |
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
6)索引
>db.User.createIndex({"name":1})
语法中 name值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可
7)实际工作中用到的语句
//查询-按时间倒序排序 db.ua_click_indexes.find({"channel_id":'514'}).sort({"createDate":-1}) //插入语句 db.ua_click_indexs.insert( { _id: 'd38b259e582bdde8:BDFE7F94-5E16-4D9F-9242-71EF1CB5392Q:idfa', index: '4C57690C8FA2882FFFC2854F9655C1AC', ry_touchpoint_ts: Long("1684227178401"), device_type: 'idfa', channel_id: '514', createDate: ISODate("2023-05-16T08:52:59.127Z") } ) //修改语句 db.ua_click_indexes.updateOne({clickid : "d38b259e582bdde8:33DAF16C-D1EA-E82B-4C29-6AC283F55D2E:idfa",channel_id:'2586'}, {$set: {indexes_params: [ { num: 0, index: '97903AC19D37F98D7E59E51A56683470', ry_touchpoint_ts: Long("1687756701000") } ] }}); db.ua_click_vals.updateOne({_id: "E43A2D38EDB3BB20BB819524FAFD0A9C"}, {$set: {hasMatched: false}});