前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mongodb位运算$bit介绍及使用场景详解

mongodb位运算$bit介绍及使用场景详解

作者头像
vakinge
发布2023-02-22 15:28:12
6680
发布2023-02-22 15:28:12
举报
文章被收录于专栏:伯约架构思维伯约架构思维

mongodb位运算$bit介绍及使用场景详解

最近在做一个教学相关一个项目,由于是一个多租户SaaS平台,需要支持租户完全自定义课程的属性,如:城市、区域、校区、年级、科目以及学费、杂费等等,于是我们选用的数据库是mongoDB。其中一个模块是课程上架模块。与本博文相关大致需求如下:课程包括年级,年级可以多选,譬如一堂素能课程是1~3 年级一起上。大致落库后数据如下:

代码语言:javascript
复制
{
  "_id": "5fe579e50bbc4871415352d3",
  "name": "舞蹈课",
  "gradeList": [
    "一年级","二年级","三年级"
  ]
}

现在需要一年级三年级的所有课程,当然我们通过$elemMatch也是可以查询的,查询语句如下:

代码语言:javascript
复制
db.course_info.find({
  "gradeList": {"$elemMatch": {"$in": ["一年级", "三年级"]}}
});

接下来我们实践一下通过$bit的方式来满足我们的查询需求。首先我们需要增加一个隐射gradeList的字段。假设一共有6个年级 ,那么我们就用一个6位的二进制代表6个年级 ,包含为:1,不包含为:0。那么我们可以通过111000来表示某课程为1~3年级的。

接下来我们通过以下语句,增加年级的映射字段:

代码语言:javascript
复制
db.course_info.update({"_id" : ObjectId("5fe579e50bbc4871415352d3")}, 
    {$set:{"gradeIndex": NumberInt(56)}}, 
    { multi: false, upsert: false}
);

二进制111000转换为十进制为56

那么我们可以通过以下语句查询:

代码语言:javascript
复制
#周一,周三,周五任意一天有课的
db.course_info.find( { gradeIndex: { "$bitsAnySet": [ 1, 3, 5 ] } } );
#周一,周三,周五全部有课的
db.course_info.find( { gradeIndex: { "$bitsAllSet": [ 1, 3, 5] } } );

举一反三,我们需要针对某个课程进行排课,假如一共有10节课,每一节可对于一个上课时间。现在我需要按星期搜索,譬如要查询所有周一,周三,周五需要上课的课程。同样我们可以把排班计划周一到周日映射为二进制:1111111

附1:按位查询运算符语法

方法名

描述

$bitsAllClear

指定位或运算全部为0

$bitsAllSet

指定位或运算全部为1

$bitsAnyClear

指定位或运算任意为0

$bitsAnySet

指定位或运算任意为1

附2:java进制转换

代码语言:javascript
复制
//二进制转十进制
int value = Integer.parseInt("111000",2);
System.out.println(value);
//十进制转二进制
String binary = Integer.toBinaryString(value);
System.out.println(binary);

个人简介

热爱技术、开源拥趸、微服务践行者。

个人开源项目列表:

  • https://gitee.com/vakinge/jeesuite-libs (组件库)
  • https://gitee.com/vakinge/jeesuite-config (配置中心)
  • https://gitee.com/vakinge/jeesuite-passport (统一认证平台)
  • https://gitee.com/vakinge/oneplatform (企业级开发平台)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mongodb位运算$bit介绍及使用场景详解
    • 附1:按位查询运算符语法
      • 附2:java进制转换
        • 个人简介
        相关产品与服务
        微服务引擎 TSE
        微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档