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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 【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一样。

目录
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
29天前
|
人工智能 运维 NoSQL
云栖大会|AI浪潮下的NoSQL演进:下一代数据库的破局之道
AI浪潮下的NoSQL演进:下一代数据库的破局之道
|
2月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
98 11
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
117 3
|
3月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。