Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';我不知道如何使用MongoDB';s$bitsAnySet运算符_Javascript_Mongodb_Bitmask - Fatal编程技术网

Javascript Can';我不知道如何使用MongoDB';s$bitsAnySet运算符

Javascript Can';我不知道如何使用MongoDB';s$bitsAnySet运算符,javascript,mongodb,bitmask,Javascript,Mongodb,Bitmask,Stackoverflow一直在帮助我完成我的小项目,但我自己从来没有问过一个问题。不过这次我没能找到我的问题 我正在做一个小项目,我需要在我的MongoDB数据库中存储工作时间。我决定在一周内使用位掩码,用336位表示,这意味着每一位表示一天中的30分钟。(使用位掩码没有特殊原因。我愿意改变存储工作时间的方式,但我还是很好奇。) 我认为如果我使用$bitsAnySet操作符根据位掩码进行查询会很方便,因为如果客户查询开放业务,例如下午4点,我可以计算出需要设置的位置 在阅读关于操作员()的文档

Stackoverflow一直在帮助我完成我的小项目,但我自己从来没有问过一个问题。不过这次我没能找到我的问题

我正在做一个小项目,我需要在我的MongoDB数据库中存储工作时间。我决定在一周内使用位掩码,用336位表示,这意味着每一位表示一天中的30分钟。(使用位掩码没有特殊原因。我愿意改变存储工作时间的方式,但我还是很好奇。)

我认为如果我使用$bitsAnySet操作符根据位掩码进行查询会很方便,因为如果客户查询开放业务,例如下午4点,我可以计算出需要设置的位置

在阅读关于操作员()的文档时,我发现您可以提供一系列需要检查的位置,这非常适合我的需要

但问题是。我搞不懂这些职位是怎么工作的。 docs声明,位置0将位于最低有效位(最右边的一位),这意味着如果查询$bitsAnySet:[0],将找不到存储为营业时间的编号为254(0b1111 1110)的文档,因为在本例中最右边的位设置为0

这样使用操作符,在我的测试数据上测试它,我总是遇到问题,因为定位似乎不匹配

因此,我自己编写了一个小脚本(在nodejsv12上运行JavaScript,使用Mongoose连接到MongoDB),它只是尝试了所有可能的位置:

下面是我的脚本:

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' }
]