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 (企業級開發平臺)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281708.html
標籤:其他
上一篇:計算機網路實驗 ——wireshark抓包簡要分析TCP、UDP協議
下一篇:ARM Neon學習資源整理
