赞
踩
用一个10进制数字,表示多种意义,一般都会遇到这种需求。
比如:会议室设备字段 A(int)用A字段表示会议室中是否有:1投影 2 八爪鱼 3 黑板
下面介绍用A字段进行标记三种意义
下面罗列出所有选项
二进制 | 十进制 | 含义 |
---|---|---|
001 | 1 | 投影 |
011 | 3 | 八爪鱼+投影 |
100 | 4 | 黑板 |
010 | 2 | 八爪鱼 |
101 | 5 | 黑板+投影 |
110 | 6 | 黑板+八爪鱼 |
111 | 7 | 黑板+八爪鱼+投影 |
查询A字段是否有投影
select * from table where 1 = A & 1
查询A字段是否有八爪鱼
select * from table where 2 = A & 2
查询A字段是否有黑板
select * from table where 4 = A & 4
mysql 位与运算符 ( & ) :对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0
SELECT 1&1,2&1,3&1,4&1,5&1,6&1,7&1 二进制如下
001 010 011 100 101 110 111
001 001 001 001 001 001 001
|-----|-----|-----|-----|-----|-----|-----|
001 000 001 000 001 000 001
上下运算结果 位数都为1则返回1
所以大家看出来了。我们选的代表值1,2,4必须是2的倍数100 010 001所以在查询的时候只有一个1
下面是更新
位或运算符 ( | ) :对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0
更新字段A中有八爪鱼
update table where A=A|2
更新字段A中有黑板
update table where A=A|4
原数据
$bitsAllSet 转换二进制对比固定位置为1
查询有投影(返回二进制从右往左 第0位为1的数据)
db.bittest.find({ a: { $bitsAllSet: [0] } } )
查询有八爪鱼(返回二进制从右往左 第1位为1的数据)
db.bittest.find({ a: { $bitsAllSet: [1] } } )
查看投影和八爪鱼都有的数据
db.bittest.find({ a: { $bitsAllSet: [0,1] } } )
更新与mysql相似
0011
0100
|------|
0111
更新字段中有投影
db.bittest.update(
{ _id: 2 },
{ $bit: { a: { or: NumberInt(1) } } }
)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。