$bitsAnySet
$bitsAnySet
버전 3.2에 새로 추가되었습니다.
$bitsAnySet
은 쿼리에서 지정된 비트 위치 중 하나라도 설정된 문서와 일치합니다(예:1
)field
.{ <field>: { $bitsAnySet: <numeric bitmask> } }
{ <field>: { $bitsAnySet: [ <position1>, <position2>, ... ] } }
field
값은 숫자 또는 BinData 인스턴스여야 합니다. 그렇지 않으면$bitsAnySet
이(가) 현재 문서와 일치하지 않습니다.- 숫자 비트마스크
- 피연산자 필드와 일치시킬 숫자 비트마스크를 제공할 수 있습니다. 비트마스크는 음수가 아닌 64비트 부호 있는 정수여야 합니다. 그렇지 않으면
$bitsAnySet
오류를 반환합니다. - BinData Bitmask
- 임의로 큰 BinData 인스턴스를 비트 마스크로 사용할 수도 있습니다.
- 위치 목록
- 비트 위치 목록을 쿼리하는 경우 각
<position>
은 음수가 아닌 정수여야 합니다. 비트 위치는 최하위 비트에서0
부터 시작합니다. 예를 들어 10진수254
의 비트 위치는 다음과 같습니다.
비트 값11111110직위76543210
행동
시스템의 엔디안 은 머신의 아키텍처에 따라 달라집니다. BSON 데이터의 숫자는 항상 리틀 엔디안 으로 저장되며, 시스템이 빅 엔디안 인 경우 숫자 데이터가 빅 엔디안과 리틀 엔디안 간에 변환됩니다.
비트 테스트 일치 표현식 연산자의 컨텍스트에서:
BinData
값은 비트 마스크 로 작동합니다. 임의의 길이의 부호 없는 리틀 엔디안 숫자인 것처럼 해석됩니다. 주소 지정 가능한 최하위 바이트는 항상 최하위 바이트로 해석됩니다. 마찬가지로 BinData
에서 주소 지정 가능한 가장 높은 바이트는 항상 최상위 바이트로 해석됩니다.
Indexes
쿼리의 $bitsAnySet
부분에는 인덱스를 사용할 수 없지만, 쿼리의 다른 부분에는 인덱스를 사용할 수 있습니다(해당하는 경우).
부동 소수점 값
$bitsAnySet
는 부호 있는 64비트 정수로 표시할 수 없는 숫자 값과 일치하지 않습니다. 값이 너무 크거나 너무 작아서 부호 있는 64비트 정수에 맞지 않거나 분수 구성 요소가 있는 경우가 이에 해당할 수 있습니다.
부호 확장
숫자는 부호가 확장되어 있습니다. 예를 들어 $bitsAnySet
는 음수 -5
에 대해 비트 위치 200
이 설정된 것으로 간주하지만, 양수 +5
에 대해서는 비트 위치 200
은 설정되지 않은 것으로 간주합니다.
반대로 BinData 인스턴스는 0 확장입니다. 예를 들어 다음 문서가 있다고 가정해 보겠습니다.
db.collection.save({ x: BinData(0, "ww=="), binaryValueofA: "11000011" })
$bitsAnySet
는 x
외부의 모든 비트가 설정되지 않은 것으로 간주합니다.
예시
다음 예시에서는 다음 문서와 함께 컬렉션을 사용합니다.
db.collection.save({ _id: 1, a: 54, binaryValueofA: "00110110" }) db.collection.save({ _id: 2, a: 20, binaryValueofA: "00010100" }) db.collection.save({ _id: 3, a: 20.0, binaryValueofA: "00010100" }) db.collection.save({ _id: 4, a: BinData(0, "Zg=="), binaryValueofA: "01100110" })
비트 위치 배열
다음 쿼리는 $bitsAnySet
연산자를 사용하여 필드 a
에 비트 위치 1
또는 비트 위치 5
가 설정되어 있는지 테스트하며, 여기서 최하위 비트는 위치 0
입니다.
db.collection.find( { a: { $bitsAnySet: [ 1, 5 ] } } )
쿼리가 다음 문서와 일치합니다.
{ "_id" : 1, "a" : 54, "binaryValueofA" : "00110110" } { "_id" : 4, "a" : BinData(0,"Zg=="), "binaryValueofA" : "01100110" }
Integer Bitmask
다음 쿼리는 $bitsAnySet
연산자를 사용하여 a
0
필드의1
, 및 위치에 비트가 설정되어 5
있는지 테스트합니다(비트 마스크 의 이진 35
표현은 00100011
임).
db.collection.find( { a: { $bitsAnySet: 35 } } )
쿼리가 다음 문서와 일치합니다.
{ "_id" : 1, "a" : 54, "binaryValueofA" : "00110110" } { "_id" : 4, "a" : BinData(0,"Zg=="), "binaryValueofA" : "01100110" }
BinData Bitmask
다음 쿼리는 $bitsAnySet
연산자를 사용하여 필드의 a
4
및 5
( 의 이진 표현은 BinData(0, "MA==")
00110000
) 위치에 비트가 설정되어 있는지 테스트합니다.
db.collection.find( { a: { $bitsAnySet: BinData(0, "MA==") } } )
쿼리가 다음 문서와 일치합니다.
{ "_id" : 1, "a" : 54, "binaryValueofA" : "00110110" } { "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" } { "_id" : 3, "a" : 20.0, "binaryValueofA" : "00010100" } { "_id" : 4, "a" : BinData(0,"Zg=="), "binaryValueofA" : "01100110" }