mongodb位运算$bit介绍及使用场景详解
Posted 伯约听风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb位运算$bit介绍及使用场景详解相关的知识,希望对你有一定的参考价值。
mongodb位运算$bit介绍及使用场景详解
最近在做一个教学相关一个项目,由于是一个多租户SaaS平台,需要支持租户完全自定义课程的属性,如:城市、区域、校区、年级、科目以及学费、杂费等等,于是我们选用的数据库是mongoDB。其中一个模块是课程上架模块。与本博文相关大致需求如下:课程包括年级,年级可以多选,譬如一堂素能课程是1~3 年级一起上。大致落库后数据如下:
"_id": "5fe579e50bbc4871415352d3",
"name": "舞蹈课",
"gradeList": [
"一年级","二年级","三年级"
]
现在需要一年级和三年级的所有课程,当然我们通过$elemMatch
也是可以查询的,查询语句如下:
db.course_info.find(
"gradeList": "$elemMatch": "$in": ["一年级", "三年级"]
);
接下来我们实践一下通过$bit
的方式来满足我们的查询需求。首先我们需要增加一个隐射gradeList
的字段。假设一共有6个年级 ,那么我们就用一个6位的二进制代表6个年级 ,包含为:1,不包含为:0。那么我们可以通过111000
来表示某课程为1~3年级的。
接下来我们通过以下语句,增加年级的映射字段:
db.course_info.update("_id" : ObjectId("5fe579e50bbc4871415352d3"),
$set:"gradeIndex": NumberInt(56),
multi: false, upsert: false
);
二进制
111000
转换为十进制为56
那么我们可以通过以下语句查询:
#周一,周三,周五任意一天有课的
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进制转换
//二进制转十进制
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 (企业级开发平台)
以上是关于mongodb位运算$bit介绍及使用场景详解的主要内容,如果未能解决你的问题,请参考以下文章