$bit
定義
$bit
$bit
演算子は、フィールドのビット単位の更新を実行します。 この演算子は、ビット単位のand
、ビット単位のor
、ビット単位のxor
をサポートします(つまり 排他的論理和)操作。$bit
演算子式を指定するには、次のプロトタイプを使用します。{ $bit: { <field>: { <and|or|xor>: <int> } } } この演算子は整数フィールド(32 ビット整数または 64 ビット整数)でのみ使用します。
埋め込みドキュメントまたは配列で
<field>
を指定するには、 ドット表記 を使用します。注意
mongosh
内のすべての数値は、整数ではなく double です。 整数を指定するには、NumberInt()
またはNumberLong()
コンストラクターを使用します。 詳細については、 NumberIntまたはNumberLongを参照してください。
動作
MongoDB 5.0 以降、$bit
などの更新演算子を空のオペランド式({ }
)と併用しても、mongod
でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、oplog エントリも作成されません(操作は実行されません)。
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
例
次の例では、 switches
コレクションを使用します。
db.switches.insertMany( [ { _id: 1, expdata: Int32(13) }, { _id: 2, expdata: Int32(3) }, { _id: 3, expdata: Int32(1) } ] )
ビットごとの AND
updateOne()
操作でビット単位のand
を使用してexpdata
を更新します。
db.switches.updateOne( { _id: 1 }, { $bit: { expdata: { and: Int32( 10 ) } } } )
ビット単位のand
演算。
は、次のビット単位の値を取得します:
expdata
and
を使用して Int32(10)のビット値を適用する結果 1000 で
expdata
を更新
1101 // expdata 1010 // Int32(10) ---- 1000
バイナリ 1000 は Int32(8) と同等です。 db.switches.find( { _id: 1 } )
コマンドは次のドキュメントを返します。
{ "_id" : 1, "expdata" : 8 }
ビットごとの論理和
updateOne()
操作でビット単位のor
を使用してexpdata
を更新します。
db.switches.updateOne( { _id: 2 }, { $bit: { expdata: { or: Int32( 5 ) } } } )
ビット単位のor
演算。
は、次のビット単位の値を取得します:
expdata
or
を使用して Int32(5) のビット値を適用するは 0111 という結果で
expdata
を更新します
0111 // expdata 0101 // Int32(5) ---- 0111
バイナリ 0111 は Int32(7) と同等です。 db.switches.find( { _id: 2 } )
コマンドは次のドキュメントを返します。
{ "_id" : 2, "expdata" : 7 }
Bitwise XOR
updateOne()
操作でビット単位のxor
を使用してexpdata
を更新します。
db.switches.updateOne( { _id: 3 }, { $bit: { expdata: { xor: Int32( 5 ) } } } )
ビット単位のand
演算。
は、次のビット単位の値を取得します:
expdata
and
を使用して Int32(5) のビット値を適用するは 0100 という結果で
expdata
を更新します
0001 // expdata 0101 // Int32(5) ---- 0100
バイナリ 0100 はInt32(4)
と同等です。 db.switches.find( { _id: 3 } )
コマンドは次のドキュメントを返します。
{ "_id" : 1, "expdata" : 4 }