NoSQL数据使用指令和引擎连接数据库实例

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 【5月更文挑战第8天】本文介绍了MongoDB的本地使用和常用操作,包括通过mongo shell连接数据库、显示数据库和集合,以及副本集设置。最后提到了MongoDB的日志功能和顶点集的使用,如capped collection的创建和管理。

1 本地使用,mongo shell指令

在安装路径,使用控制台执行 mongo.exe, 自动连接127.0.0.1:27017

  db   # 显示当前数据库
  show dbs # 显示当前所有数据库和使用空间。

  db.adminCommand( { listDatabases: 1 } )  # 显示所有 db
  use users  # 选择 users 数据库

查看当前数据库的所有连接集合,即关系型数据库的表

    show collections   

副本集设置 replSet, windows是在安装目录下 mongod.exe

  mongod --port 27017 --dbpath " \MongoDB\backup\data" --replSet rs0

2 常用操作

  • 管道 pipeline: 所有 在 1970-01-01出生的人

    var pipeline =3D [
    {"$unset": [
      "_id",
      "address",
    ]},   =20
     =20
    // Only match people born on or after 1st January 1970
    {"$match": {
      "dateofbirth": {"$gte": ISODate("1970-01-01T00:0=0:00Z")},
    }},
    

    =20

    /*
    {"$sort": {
      "dateofbirth": -1,
    }},     =20
     =20
    {"$limit": 2}, =20
    */
    ];
    
  • 小于某个值的数据

表达式 $$NOW 筛选全部年龄低于18的人 $lt var pipeline =3D [ {"$match": {"$expr":{ "$lt": ["$dateofbirth", {"$subtract": [= "$$NOW", 18<=/span>365.25246060*1000]}]
}},
},

  • 大于某个值的数据
    匹配产品价格大于 15.00 的商品。

    $gt
    
    {"$match": {
      "products.price": {
        "$gt": NumberDecimal("15.00"),
      },
    }},
    

3 连接管理

我们先不理会连接池。 创建单个连接需要哪些步骤,如果从传输层连接开始,那么将很漫长。
所以这里只看第三方库如何创建和管理的连接。

使用连接库: pymongo操作, 指令是从右到左顺序执行的。

  • pymongo代码指令

    创建连接

     cli = pymongo.MongoClient('127.0.0.1', 27017)
    

    创建数据库test

       db = cli.test
       db.name
       test
    

    查看连接属性

    db.my_collection
    
    Collection(Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'test'), 'my_collection')
    

4 查询指令

查询最近N个数据,按create_time由近及远排序

  db.history_vedio_info.find().limit(10).sort({"create_time":-1})

查询最近5个

  db.history_vedio_info.find().limit(5).sort({"create_time":-1})   

模糊查询, 中间匹配

  db.history_vedio_info.find({"start_time":/2020-12-17/}).sort({"create_time":-1}).count()   

模糊查询 以 2020-12-17 开头的

  db.user.find(name:/^2020-12-17/);    

模糊查询不区分大小写

  db.user.find(name:/a/i);           
  • 去重

    字段去重

      db.getCollection("表名").distinct("字段名");   
    

    某字段的按条件去重

      db.getCollection("表名").distinct('字段名',{筛选条件})  
    

    嵌入字段去重

       db.getCollection("distinct").distinct("article_numbers.vol")
    

    去重后统计

      db.student.distinct("name",{"age" : 18}).length
    

    表名去重

      db.collection.distinct() 
    

    聚合查询

    db.student.aggregate([
    {$match:{"age" : 18}},
    {$project:{"name":true}},
    {$group:{_id:"$name"}},
    {$group:{_id:null,count:{$sum:1}}}
    ])

    • 查询表

    socket_users 中所有name 并隐藏id,美观显示, and 关键字两个条件同时满足

     db.socket_users.find({$and:[{"name":"jack", "id":3}]}).pretty()
    

    投影查询,with projection is as follows , 即只显示集合的某一部分 只显示文档的title部分,

    db.mycol.find({}, {"title":1, _id:0})    
    

查询限制 limit 和 查询跳跃 skip

 db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

只显示第二个文档

 db.COLLECTION_NAME.find().limit(1).skip(1)   

最近5个

 db.history_vedio_info.find().limit(5).sort({"create_time":-1})   
  • 查询排序

    1表示升序索引
    查询收集集合的数据按title升序排列

    db.COLLECTION_NAME.find().sort({“title”:1})   
    

-1 降序索引

多个字段索引,title 1 升序索引,description -1 降序索引

 db.mycol.createIndex({"title":1,"description":-1})   
  • 聚合查询

    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
    

显示一个列表,显示每个用户编写了多少教程

  db.mycol.aggregate([{$group:{_id:"$by_user", num_tutorial:{$sum:1}}}])   

5 写入数据

插入一条数据

  db.my_collection.insert_one({"x":10}).inserted_id
      ObjectId('5fa0e195be9d31bf346b0c75')

插入两条相同数据,mongodb 默认id是hash自增的

  db.my_collection.insert_one({"x":110}).inserted_id   
   ...
  db.my_collection.insert_one({"x":110}).inserted_id  

查找最近的一条数据

    db.my_collection.find_one() 
       {'_id': ObjectId('5fa0e210be9d31bf346b0c77'), 'x': 110}

查找全部数据并遍历,升序排序

 for item in db.my_collection.find().sort("x", pymongo.ASCENDING):
         print(item["x"])

  10
  101
  110
  110
  1034

查找数据x并按x排序,默认升序

[item["x"] for item in db.my_collection.find().sort("x")]  
    [10, 101, 110, 110, 1034]
  [item["x"] for item in db.my_collection.find().sort("x", pymongo.ASCENDING)]
    [10, 101, 110, 110, 1034]  
  • 从查询的所有数据中 跳过第一个数,并限取两个数

    [item["x"] for item in db.my_collection.find().limit(2).skip(1)]

     [10, 101]
    

6 pymongo 常用操作

创建客户端

  import pymongo
  client = pymongo.MongoClient(host='localhost', port=27017)

指定数据库

   db = client.test

或者

   db = client['test']

指定集合(表)

    collection = db.students 

    collection = db['students']

插入数据

  student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
  }
  result = collection.insert(student)

插入多条数据,传入列表即可

  students = [{
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
  }, {
    'id': '20170102',
    'name': 'Jordans',
    'age': 21,
    'gender': 'male'
  }]
  result = collection.insert(students)
  • 更新,指定更新的条件和更新后的数据即可

      condition = {"name":"Kexin"}
      student = collection.find_one(condition)
      student['age'] = 25
      result = collection.update(condition, student)
      print(result)
    
    {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}   # ok代表执行成功,nModified代表影响的数据条数
    

    $set

    使用 \$set可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。

    而如果不用\$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除

      res = collection.update(condition, {'$set':student})
    

7 删除

删除示例,某字段相同的所有记录

  db.info.aggregate([
{
$group:{_id:{web_url:"$web_url"},count:{$sum:1},dups:{$addToSet:"$_id"}}
},
{
$web_url:{count:{$gt:1}}
}
]).forEach(function(doc){
doc.dups.shift();
db.info.remove({_id:{$in:doc.dups}});
})

8 小结

mongdb可用于写日志,有现成的 参数可用,而不必 组织后端日志知识。

除了这些性能因素之外,日志数据是通常可以利用无模式集合的数据集之一。

mongodb 拥有一项 功能称为 顶点集。 capped collection.
我们创建的所有隐式创建的集合都只是普通的集合。

我们可以使用 db.createCollection 创建一个顶点集合。

如下示例,并将其标记为上限1M:

db.createCollection('logs', {capped: true,size: 1048576})

当顶点集到达限制,1MB后,旧的文档 立即被清理掉。

文件的大小,限制都可使用 MAX指定。

顶点集有一些有用的属性

比如 更新 顶点集的 文档而不必改变其 大小。

像tail 一个linux文件一样,tail 顶点集中的文档。

expire 可设置一个文档的 生存时间,就像TTL一样。

目录
相关文章
|
4天前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
2天前
|
存储 NoSQL 算法
使用图数据库进行复杂数据建模:探索数据关系的无限可能
【8月更文挑战第17天】图数据库以其高效的关系查询能力、直观的数据表示方式、灵活的数据模型和强大的可扩展性,在复杂数据建模和查询中展现出了巨大的潜力。随着大数据和人工智能技术的不断发展,图数据库的应用领域也将不断拓展和深化。对于需要处理复杂关系网络和数据关联性的场景来说,图数据库无疑是一个值得深入研究和应用的强大工具。
|
3天前
|
资源调度 关系型数据库 MySQL
【Flink on YARN + CDC 3.0】神操作!看完这篇教程,你也能成为数据流处理高手!从零开始,一步步教会你在Flink on YARN模式下如何配置Debezium CDC 3.0,让你的数据库变更数据瞬间飞起来!
【8月更文挑战第15天】随着Apache Flink的普及,企业广泛采用Flink on YARN部署流处理应用,高效利用集群资源。变更数据捕获(CDC)工具在现代数据栈中至关重要,能实时捕捉数据库变化并转发给下游系统处理。本文以Flink on YARN为例,介绍如何在Debezium CDC 3.0中配置MySQL连接器,实现数据流处理。首先确保YARN上已部署Flink集群,接着安装Debezium MySQL连接器并配置Kafka Connect。最后,创建Flink任务消费变更事件并提交任务到Flink集群。通过这些步骤,可以构建出从数据库变更到实时处理的无缝数据管道。
15 2
|
4天前
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
4天前
|
JavaScript 前端开发 数据处理
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
这篇文章介绍了如何在Vue框架的表单中将下拉框的数据通过后端接口从数据库动态查询并加载,包括前端HTML代码、JavaScript数据处理、后端接口实现以及表单提交的完整流程。
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
|
3天前
|
数据库连接 数据库
Thinkphp6多数据库实例跨库操作
Thinkphp6多数据库实例跨库操作
12 0
|
4天前
|
数据库 知识图谱
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
11 0
|
5天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
18 0
|
5天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
7天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。