通过 $bitAllSet 在 MongoDB 中查询具有偏移量和大小限制的 BinData 字段

问题描述 投票:0回答:1

假设我有一个任意长度的 BinData 字段,用于存储 n 字节项目。每个项目的偏移量在查询之前就已知,并且所有项目都是 n 个字节。我想用位掩码 Y 测试偏移量 X 处的项目。值得一提的是,我不想进行搜索,只是进行位掩码测试,因为偏移量是已知的。

目前,我正在阅读整个领域并在我的服务器端进行测试。

有没有办法在 MongoDB 端做到这一点?

mongodb mongodb-query
1个回答
0
投票

是的,这是可能的。但是,由于索引无济于事,因此使用位掩码检查的每个查询都将是一次集合扫描。

要测试各个位,您首先需要创建一对掩码,一个与您想要的位匹配

1
,另一个与您想要的位匹配
0

例如,我创建了一个包含一些 22 字节二进制对象的集合:

[
{"i":0,"b":{"$binary":{"base64":"P40M+wuXLpQSSrk=","subType":"00"}}},
{"i":1,"b":{"$binary":{"base64":"2AQ/oJEM8Nm3TdU=","subType":"00"}}},
{"i":2,"b":{"$binary":{"base64":"R1qgtnJpT1efm9E=","subType":"00"}}},
{"i":3,"b":{"$binary":{"base64":"yMCw8yq42iZxSe4=","subType":"00"}}},
{"i":4,"b":{"$binary":{"base64":"1FSUZUvlKwFMea0=","subType":"00"}}},
{"i":5,"b":{"$binary":{"base64":"qml1+0cd8E+3hLQ=","subType":"00"}}},
{"i":6,"b":{"$binary":{"base64":"wToGlD672/zqP04=","subType":"00"}}},
{"i":7,"b":{"$binary":{"base64":"uM4igB9AvbNH5XQ=","subType":"00"}}},
{"i":8,"b":{"$binary":{"base64":"Hb9RKX47DnRCCc4=","subType":"00"}}},
{"i":9,"b":{"$binary":{"base64":"/vdvzBeBYYo2okk=","subType":"00"}}}
]

要查找 9-12 位(第 3 个十六进制数字)为

5
(即 0101)的文档,1 位的掩码将为“0050”,具体取决于客户端,可能是以下之一:
new Binary(Buffer.from("0050", "hex"))
new HexData(0,"0050")
new BinData(0,"AFA=")

0 位的掩码为“00A0”

new Binary(Buffer.from("00A0","hex"))
new HexData(0,"00A0")
new BinData(0,"AKA=")

然后查询包含上述示例文档的集合可能如下所示:

db.collection.find({b:{
                   $bitsAllSet: new Binary(Buffer.from("0050", "hex")),
                   $bitsAllClear: new Binary(Buffer.from("00A0","hex"))
                  }})

Playground 以 base64 格式显示内容,因此查询在那里工作并不是立即显而易见的。

我在本地 mongodb 实例中运行了这个,将二进制输出为十六进制,我们可以清楚地看到每场比赛的第三个十六进制数字确实是

5

> db.collection.find({b:{$bitsAllSet:HexData(0,"0050"),$bitsAllClear:HexData(0,"00A0")}}).map(d=>{return {i:d.i,b:d.b.buffer.toString("hex")}})
[
  { i: 2, b: '475aa0b672694f579f9bd1' },
  { i: 4, b: 'd45494654be52b014c79ad' }
]
© www.soinside.com 2019 - 2024. All rights reserved.