使用指令操作Nosql数据库

举报
码乐 发表于 2024/04/19 09:50:55 2024/04/19
【摘要】 简介这里介绍如何通过指令操作mongo数据库。 1 本地使用,mongo shell指令在安装路径,使用控制台执行 mongo.exe, 自动连接127.0.0.1:27017 db # 显示当前数据库 show dbs # 显示当前所有数据库和使用空间。 db.adminCommand( { listDatabases: 1 } ) # 显示所有 db use users ...

简介

这里介绍如何通过指令操作mongo数据库。

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

1.1 常用操作

  • 管道 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.25*24*60*60*1000]}]
        }},
      },
  • 大于某个值的数据
    匹配产品价格大于 15.00 的商品。

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

2 连接管理

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

使用连接库: 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')
    

3 查询指令

查询最近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}}}])   

3 写入数据

插入一条数据

  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]

3.1 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})
    

4 删除

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

  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}});
})

5 小结

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

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

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

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

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

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

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

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

顶点集有一些有用的属性

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。