定義
$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演算。
は、次のビット単位の値を取得します:
expdataandを使用して 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演算。
は、次のビット単位の値を取得します:
expdataorを使用して 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演算。
は、次のビット単位の値を取得します:
expdataandを使用して Int32(5) のビット値を適用するは 0100 という結果で
expdataを更新します
0001 // expdata 0101 // Int32(5) ---- 0100
バイナリ 0100 はInt32(4)と同等です。 db.switches.find( { _id: 3 } )コマンドは次のドキュメントを返します。
{ "_id" : 1, "expdata" : 4 }