$bitsAllClear
Nesta página
$bitsAllClear
$bitsAllClear
corresponde a documentos em que todas as posições de bits fornecidas pela consulta são claras (ou seja,0
) emfield
.{ <field>: { $bitsAllClear: <numeric bitmask> } }
{ <field>: { $bitsAllClear: <
BinDatabitmask> } }
{ <field>: { $bitsAllClear: [ <position1>, <position2>, ... ] } }
O valor
field
deve ser numérico ou uma instância BinData . Caso contrário,$bitsAllClear
não corresponderá ao documento atual.- Máscara de bits numérica
- Você pode fornecer uma máscara de bits numérica para comparação com o campo do operando. Ela deve ser um inteiro de 64 bits assinado não negativo. Caso contrário,
$bitsAllClear
retornará um erro. - Máscara de bits BinData
- Você também pode usar uma instância BinData arbitrariamente grande como bitmask.
- Lista de posições
- Ao consultar uma lista de posições de bits, cada
<position>
deve ser um número inteiro não negativo. As posições dos bits começam em0
a partir do bit menos significativo. Por exemplo, o número decimal254
teria as seguintes posições de bits:
Valor de bits11111110Posição
7
6
5
4
3
2
1
0
Comportamento
A endianidade do seu sistema depende da arquitetura da sua máquina. Os números nos dados BSON são sempre armazenados como little-endian, se o seu sistema for big-endian , isso significa que os dados numéricos são convertidos entre big e little endian.
No contexto dos operadores de expressão de correspondência de teste de bit:
BinData
Os valores atuam como bitmasks e são interpretados como se fossem números little-endian sem sinal de comprimento arbitrário. O byte endereçável mais baixo é sempre interpretado como o byte menos significativo. Da mesma forma, o byte endereçável de maior valor no BinData
é sempre interpretado como o byte mais significativo.
Indexes
As queries não podem usar índices para a parte $bitsAllClear
de uma query, embora as outras partes de uma query possam usar índices, se aplicável.
Valores de ponto flutuante
$bitsAllClear
não corresponderá a valores numéricos que não possam ser representados como um número inteiro de 64 bits assinado. Esse pode ser o caso se um valor for muito grande ou muito pequeno para caber em um inteiro de 64 bits assinado ou se tiver um componente fracionário.
Extensão de sinal
Os números são estendidos por sinais. Por exemplo, $bitsAllClear
considera a posição de bit 200
definida para o número negativo -5
, mas a posição de bit 200
definida como o número positivo +5
.
Em contraste, as instâncias BinData são estendidas para zero. Por exemplo, dado o seguinte documento:
db.collection.save({ x: BinData(0, "ww=="), binaryValueofA: "11000011" })
$bitsAllClear
vai considerar todos os bits fora de x
como limpos.
Exemplos
Os exemplos a seguir utilizarão uma coleção com os seguintes documentos:
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" })
Array de posição de bits
A query a seguir usa o operador $bitsAllClear
para testar se o campo a
tem bits livres na posição 1
e na posição 5
, sendo que o bit menos significativo está na posição 0
.
db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )
A consulta corresponde aos seguintes documentos:
{ "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" } { "_id" : 3, "a" : 20, "binaryValueofA" : "00010100" }
Máscara de bits inteiros
A query seguinte utiliza o operador $bitsAllClear
para testar se o campo a
tem bits livres nas posições 0
, 1
e 5
(a representação binária da máscara de bits 35
é 00100011
).
db.collection.find( { a: { $bitsAllClear: 35 } } )
A consulta corresponde aos seguintes documentos:
{ "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" } { "_id" : 3, "a" : 20, "binaryValueofA" : "00010100" }
Máscara de bits BinData
A query a seguir usa o operador $bitsAllClear
:
db.collection.find( { a: { $bitsAllClear: BinData(0, "IA==") } } )
A query:
Especifica
0
como o primeiro valor paraBinData
, o que indica queIA==
deve ser interpretado como binário. O valor de base-64IA==
em binário é00100000
, que tem1
na posição 5.Usa
$bitsAllClear
para retornar documentos em que o campoa
tem um bit livre0
na posição 5 do valor binário.
A consulta retorna os seguintes documentos:
{ "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" } { "_id" : 3, "a" : 20, "binaryValueofA" : "00010100" }