Javascript Can';我不知道如何使用MongoDB';s$bitsAnySet运算符
Stackoverflow一直在帮助我完成我的小项目,但我自己从来没有问过一个问题。不过这次我没能找到我的问题 我正在做一个小项目,我需要在我的MongoDB数据库中存储工作时间。我决定在一周内使用位掩码,用336位表示,这意味着每一位表示一天中的30分钟。(使用位掩码没有特殊原因。我愿意改变存储工作时间的方式,但我还是很好奇。) 我认为如果我使用$bitsAnySet操作符根据位掩码进行查询会很方便,因为如果客户查询开放业务,例如下午4点,我可以计算出需要设置的位置 在阅读关于操作员()的文档时,我发现您可以提供一系列需要检查的位置,这非常适合我的需要 但问题是。我搞不懂这些职位是怎么工作的。 docs声明,位置0将位于最低有效位(最右边的一位),这意味着如果查询$bitsAnySet:[0],将找不到存储为营业时间的编号为254(0b1111 1110)的文档,因为在本例中最右边的位设置为0 这样使用操作符,在我的测试数据上测试它,我总是遇到问题,因为定位似乎不匹配 因此,我自己编写了一个小脚本(在nodejsv12上运行JavaScript,使用Mongoose连接到MongoDB),它只是尝试了所有可能的位置: 下面是我的脚本:Javascript Can';我不知道如何使用MongoDB';s$bitsAnySet运算符,javascript,mongodb,bitmask,Javascript,Mongodb,Bitmask,Stackoverflow一直在帮助我完成我的小项目,但我自己从来没有问过一个问题。不过这次我没能找到我的问题 我正在做一个小项目,我需要在我的MongoDB数据库中存储工作时间。我决定在一周内使用位掩码,用336位表示,这意味着每一位表示一天中的30分钟。(使用位掩码没有特殊原因。我愿意改变存储工作时间的方式,但我还是很好奇。) 我认为如果我使用$bitsAnySet操作符根据位掩码进行查询会很方便,因为如果客户查询开放业务,例如下午4点,我可以计算出需要设置的位置 在阅读关于操作员()的文档
require ('mongoose').connect ('mongodb://localhost/test', {useCreateIndex: true, useNewUrlParser: true, useFindAndModify: false, useUnifiedTopology: true}).then (() => {
let buffer = Buffer.alloc (6, 0);
// 0xC0 => 0b1100 0000
buffer.writeUInt8 (0xC0, 0);
// 0x07 => 0b0000 0111
buffer.writeUInt8 (0x07, 5);
// buffer should be: 11000000 00000000 00000000 00000000 00000000 00000111
new SomeModel ({data: buffer}).save ().then (model => {
let promises = [];
// just trying out each position
for (let index = 0; index < 48; index ++)
promises.push (SomeModel.findOne ({data: {$bitsAnySet: [index]}}))
Promise.all (promises).then (resolved => {
resolved = resolved.map ((item, index) => {
if (item !== null)
return {index, item: item.data.toString ('hex')};
else return null;
});
// yes, I know it's not very performant to go over the entire array a second time,
// because I could have done it in the first round,
// but this was just some quick and dirty testing :D
resolved = resolved.filter (item => item !== null);
console.log (resolved);
})
}).catch (console.log);
}).catch (console.log);
因为当从右边看二进制表示时,它应该首先在0,1和2的位置找到三个,然后在最左端找到最后两个
但我明白了:
[
{ index: 6, item: 'c00000000007' },
{ index: 7, item: 'c00000000007' },
{ index: 40, item: 'c00000000007' },
{ index: 41, item: 'c00000000007' },
{ index: 42, item: 'c00000000007' }
]
这让我大吃一惊,因为这对我来说是完全出乎意料的,因为它突然看起来好像MongoDB从左边开始,因为它在三个一之前找到了两个一,而这两个一位于二进制数据的最左边。这也让我感到困惑的是,它似乎不是从位置0开始的
如果我没有错,我的数据以两个1开始,以三个1结束。因此,$bitsanayset:[0]应该是正确的
你们有谁知道我做错了什么吗?
我非常感谢你的帮助
注意:如果我错了,请纠正我的错误,但我相信Promise.all不会改变数组的顺序,这意味着它不可能只是一个Promise在另一个promises数组中更改其位置之前刚刚解决
注意:该模型没有任何附加字段。它只有默认的_id字段和数据字段
[
{ index: 6, item: 'c00000000007' },
{ index: 7, item: 'c00000000007' },
{ index: 40, item: 'c00000000007' },
{ index: 41, item: 'c00000000007' },
{ index: 42, item: 'c00000000007' }
]