首页 > 其他分享 >Mongo特殊操作

Mongo特殊操作

时间:2024-04-11 11:26:53浏览次数:16  
标签:特殊 Mongo db getCollection update 字段 操作 id name

Mongo语法

类比mysql中的一些用法,记录mongo用法

1、查询部分字段

字段标注不为0则取该字段,为0则不取,_id字段默认取,除_id外不同字段标注值必须相同

db.getCollection('doctor').find({},{name:1,_id:0})

2、给字段起别名

聚合操作中使用$project给office字段起别名为科室

//聚合-字段别名
db.getCollection('doctor').aggregate([{
    $project: {
        _id: 0,
        name: 1,
        date: 1,
        '科室':'$office'
    }
}])

3、修改字段名

使用update将字段原名修改

//字段重命名
db.getCollection("doctor").update(

    {},
    //将字段名修改成doctorId
    { $rename: { "id": "doctorId" } }

    , { multi: true }

)

4、日期和字符串

momgo中提供了一些日期相关的函数。
以及字符串和日期之间转换的函数。
Date()生成字符串,new Date()和ISODate()则生成日期

db.nurse.aggregate({
    $project: {
        date: {$dateToString: {format: "%Y:%m:%d %H:%M:%S:%L",date: '$date'}}
    }
})


db.doctor.aggregate({
    $project: {
        date: {$dateFromString: {format: "%Y/%m/%d",dateString: '$date'}}, //ISODate("2010-04-01T00:00:00.000+0000")
        date2: Date(),//字符串 "Thu Jun 17 2021 09:41:19 GMT+0800"
        date3: ISODate(), //ISODate("2021-06-17T01:41:19.315+0000")
        date4:  new Date() //ISODate("2021-06-17T01:41:19.315+0000")
    }
})

5、分组查询top5

使用聚合操作分组,按照数量降序排列,取符合条件的top5

////查询相同parentId的数据数量的top5
db.getCollection("fraudType").aggregate(
    [
        { 
            $match : { 
                parentId : { 
                    //字段为字符串类型
                    $type : 2.0
                }
            }
        }, 
        { 
            $group : { 
                _id : '$parentId', 
                count : { 
                    //分组求和
                    $sum : 1.0
                }
            }
        }, 
        { 
            $sort : { 
                //以count字段倒序排列
                count : -1.0
            }
        }, 
        { 
            $limit : 5.0
        }
    ]
);

6、匹配、分组、组合、拆分、匹配、排序再取top

通过$push、$addToSet、$unwind这些操作可以轻松实现行转列、列转行

db.getCollection("fraudType").aggregate(
    [
        {
            $match: {
                parentId: {
                    //字段为字符串类型
                    $type: 'string'
                }
            }
        },
        {
            $group: {
                _id: '$parentId',
                count: {
                    //分组求和
                    $sum: 1.0
                },
                last_name: { $last: "$name" },
                first_name: { $first: "$name" },
                other: { $push: "$code" },
                url: { $addToSet: "$name" }
            }
        }, {
            $unwind: "$url"
        },
        {
            $match: {
                url: "其他"
            }
        },
        {
            $sort: {
                //以count字段倒序排列
                count: -1.0
            }
        },
        {
            $limit: 5.0
        },
        {
            $project: { _id: 0 }
        }
    ]
);


7、主键Id自增

MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识。
但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。
由于 MongoDB 没有实现这个功能,我们可以通过函数实现。

//创建一个计数集合,里面存放主键名和序列最大值
db.createCollection("counters")
//插入一条数据,代表id为productid的数据的序列极值
db.counters.insert({_id:"productid",sequence_value:0})

//自增函数,作用是计数器集合中存在该id则序列加1
function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify(
      {
         query:{_id: sequenceName },
         update: {$inc:{sequence_value:1}},
         "new":true
      });
   return sequenceDocument.sequence_value;
}
//插入数据,序列加1
db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"})

db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"})
 
//{ "_id" : 1.0, "product_name" : "Apple iPhone", "category" : "mobiles" }
//{ "_id" : 2.0, "product_name" : "Samsung S3", "category" : "mobiles" }

8、更新

更新语句,通过操作符$set、$unset等修改,除了查询和修改两个参数对象外,第三个参数对象决定是否把符合条件的全修改以及数据不存在该字段时是否插入新字段。


db.getCollection("fraudType").update(
    { code: "01040231" },//匹配条件
    { $set: { name: "其他案件" } }) //修改

db.getCollection("fraudType").update(
    { code: "01040231" },//匹配条件
    { $unset: { name: "其他案件" } }) //置空

db.getCollection("fraudType").update(
    { code: "01040231" },//匹配条件
    { $set: { name: "其他案件" }},//本字段已经不存在
    {upsert: true, multi : true}//字段不存在则插入新字段,符合条件则全部修改
    ) 

8、联表查询

使用$lookup操作符可以达到左连接的效果,匹配的数据会被重命名成一个数组返回。
db.nurse.aggregate([{
    $lookup: {
        from: 'doctor',
        localField: "name",
        foreignField: "name",
        as: "data"
    }
},
{ $unwind: "$data" },//把数组拆开
{$project:{
    _id: 0,
    "data._id": 0 //获取嵌套的数据
    }}
])

标签:特殊,Mongo,db,getCollection,update,字段,操作,id,name
From: https://www.cnblogs.com/cgl-dong/p/14891921.html

相关文章

  • Cisco NX-OS Software Release 10.4(3)F - 网络操作系统软件
    CiscoNX-OSSoftwareRelease10.4(3)F-网络操作系统软件NX-OS网络操作系统请访问原文链接:CiscoNX-OSSoftwareRelease10.4(3)F-网络操作系统软件,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCiscoNX-OSCiscoNX-OS操作系统助力网络紧跟业务发展步伐......
  • Linux 目录/文件操作命令
    1)pwd    显示用户当前所处的工作目录2)cd    切换工作路径3)ls    显示目录中的文件信息ls-a#查看全部文件,包括隐藏文件ls-l#查看文件的详细属性信息ls-ld#查看目录属性信息4)cat     ......
  • SSL证书续费操作流程
    市面上所有的SSL证书都不是长期的,一定的有效期。证书过期后,网站可能会无法访问且提出不安全警告。不仅会影响网站的信誉,还会导致数据泄露,给网站和用户带来风险。因此,需要及时对SSL证书进行续费!JoySSL,Digicert,Sectigo,GlobalSignSSL证书续费点击这里续费SSL证书的流程通......
  • zk实践操作
    1.入门基础应用场景ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂......
  • mongodb备份恢复
    1.mongo状态查看监控及时获得应用的运行状态信息,在问题出现时及时发现。监控哪些CPU、内存、磁盘I/O、应用程序(MongoDB)、进程监控(ps-aux)、错误日志监控mongo内部状态db.serverStatus()查看实例运行状态(内存使用、锁、用户连接等信息)通过比对前后快照进行性能分析"......
  • hadoop篇——nameNode DataNode SecondaryNameNode的作用,以及如何查看操作日志
    集群下的hadoop(112主节点113,114从节点)如果112挂了,数据以及操作日志会丢失无法恢复,又称单点故障。再启动start-all.shhadoop后,主节点会产生name以及secondary两个文件 所在地址在  /root/training/hadoop-2.7.3/tmp/dfs其中name对应的是NameNode节点:接受客户端的请......
  • AtomGit 代码托管平台评测赛——完整操作指南
    AtomGit优势功能:基于Git的代码管理平台,基础功能完整,并且有一套完整的对照文档,看到了一个新功能代码扫描,是个新鲜点。性能:整体测试,包括5G以内文件测试,都是以自身网速极限的状态完成,性能非常棒。易用性:与git操作无异,方便的是国内网络,配置完基本信息后操作特别顺畅。页面功能......
  • C++ 获取数组大小、多维数组操作详解
    获取数组的大小要获取数组的大小,可以使用sizeof()运算符:示例intmyNumbers[5]={10,20,30,40,50};cout<<sizeof(myNumbers);结果:20为什么结果显示为20而不是5,当数组包含5个元素时?这是因为sizeof()运算符返回类型的大小(以字节为单位)。要找出数组有多少......
  • jackson 使用jsonNode与objectNode 实现访问json对象, 操作json对象
    前情提要因为现有项目都用的阿里巴巴的fastjson做json串的序列化与反序列化,但是fastJson的漏洞太多了,经常处理扫描出来的漏洞时,需要升级版本,导致出现各种大大小小的bug,经过考究,决定使用jackSon做新项目的序列化与反序列化工作,那先看一下常用的场景:将对象转为js......
  • python基础-数据类型、字典、集合、文件操作(打开、关闭、读写、追加等)
    前言!!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失。观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:​​2022Python的web开发(完整版)入门全套教程,零基础入门到项目实战​数据结构数据类型字符串列表元组集合字典整型布尔None浮点型字节类......