当前位置: 首页 > 知识库问答 >
问题:

Mongo DB在隐式AND中发现方法混淆

沈华皓
2023-03-14

我是mongodb的新手,最近开始学习基本语法。我用find方法尝试运算符,在尝试隐式和隐式时遇到了一个令人困惑的情况。

我的收藏mathtable有400个文档如下:

{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b2")  , "index" : 1   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b3")  , "index" : 2   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b4")  , "index" : 3   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b5")  , "index" : 4   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b6")  , "index" : 5   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b7")  , "index" : 6   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b8")  , "index" : 7   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b9")  , "index" : 8   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4ba")  , "index" : 9   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bb")  , "index" : 10  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bc")  , "index" : 11  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bd")  , "index" : 12  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4be")  , "index" : 13  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bf")  , "index" : 14  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c0")  , "index" : 15  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c1")  , "index" : 16  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c2")  , "index" : 17  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c3")  , "index" : 18  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c4")  , "index" : 19  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c5")  , "index" : 20  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4d1")  , "index" : 1   }
..
..
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4z5")  , "index" : 20 }

mathtable集合中有400行:

  • 索引的值范围为1到20

我正在尝试下面两个操作,并期待相同的结果,考虑到它们都是隐式AND情况。

计算值大于5的偶数索引值。

>

  • 使用经典显式AND(将结果转换为160条记录):

     db.mathtable.count({ 
                $and: [
                { index: { $mod: [2,0] } },         
                { index: { $gt: 5 } }     
                ] 
            });
    

    仅使用变量名一次(结果为160条记录):

    db.mathtable.count({ 
                      index : { $mod : [2,0] ,  $gt:5 } 
                      });
    

    在每个条件下使用字段名(结果为300条记录):

    db.mathtable.find({ 
                      index : { $mod : [2,0]} , 
                      index : {$gt:5} 
                     });
    

    将字段名与每个条件一起使用,条件按相反顺序排列(生成200条记录):

    db.mathtable.find({ 
                      index :  {$gt:5} , 
                      index : { $mod : [2,0]}
                     });
    

    mongoDB文档中没有提到隐式和(或者至少我没有找到像隐式和这样的直接引用)。

    我希望在这两种情况下都有相同数量的记录(160)。我无法理解上述代码为何表现不同。

    此外,条件规范结果的顺序分为不同数量的结果。根据观察结果,当相同的字段被指定多次时,只应用了查找中指定的最后一个条件。这是奇怪和不正确的。

    注意:我正在使用Mongo-DB-2.6,并且代码正在随发行版一起在mongoshell执行


  • 共有1个答案

    苏骏
    2023-03-14

    Json或关联数组或映射不包含重复键:

    db.mathtable.find({ 
                      index : { $mod : [2,0]} , 
                      index : {$gt:5} 
                     });
    

    上述内容将被视为等同于:

    db.mathtable.find({ 
                      index : {$gt:5} 
                     });
    

    第一个条件将被覆盖,

    以下是,

    db.mathtable.find({ 
                      index :  {$gt:5} , 
                      index : { $mod : [2,0]}
                     });
    

    将相当于,

    db.mathtable.find({ 
                      index : { $mod : [2,0]}
                     });
    

    但在第一种情况下,,

    db.mathtable.count({ 
                $and: [
                { index: { $mod: [2,0] } },         
                { index: { $gt: 5 } }     
                ] 
            });
    

    $and将两个json文档作为输入,并按预期运行。

    在第二种情况下,count获取一个没有重复键的文档,并按照预期的方式运行。

    db.mathtable.count({ 
                      index : { $mod : [2,0] ,  $gt:5 } 
                      });
    

    因此返回的行数不同。希望对你有帮助。

     类似资料:
    • 问题内容: 我在使用Hibernate生成无效SQL时遇到问题。具体来说,混合和匹配隐式和显式联接。这似乎是一个开放的错误。 但是,我不确定 为什么 这是无效的SQL。我想出了一个生成相同语法异常的小型玩具示例。 架构图 数据 工作SQL 这两个查询均有效。我意识到有笛卡尔积;那是故意的。 明确加入: 隐式加入: 无效的SQL 此查询不适用于MSSQL 2000/2008或MySQL: 在MS20

    • 为了编写所需的最少代码量,我尝试让ModelMapper生成其隐式映射,并且只为那些无法自动映射的属性编写显式属性映射。 如果我让ModelMapper使用以下命令生成隐式映射: 它抱怨具有多个可能的映射。然后,我尝试使用以下方法修复该问题: 然而,我发现ModelMapper仍在抱怨,因为实际上在上抛出了一个异常,所以它没有机会访问我的自定义映射代码。 如果我反转这两个语句,我会得到一个错误:

    • 问题内容: 在Java编程语言中,对对象的方法调用通过隐式传递对对象的引用来作用于对象并作为静态方法来工作吗? 问题答案: 有关方法调用如何工作的详细信息,请参见Java SE 7 JVM规范的3.7节 。对于实例方法,将引用作为第一个参数传递。该引用还用于选择要调用的方法,因为它可能在子类中被覆盖,因此它比静态方法要复杂一些。

    • 而RNDecryptor的addData方法如下: 我不明白这一行实际上是要做什么,它对加密流的每一个块都调用: 假设我有一个1000字节的块,而HMACLength是32。 提前道谢。

    • 我对以下涉及oauth2的流程有一些问题: webapp1.xyz.com是具有授权代码授予类型的注册客户端,以下是当前流程: 用户登录并使用授权码重定向到webapp1.xyz.com webapp1.xyz.com交换访问令牌的授权代码并将其存储到会话 webapp1.xyz.com服务器端需要通过传递访问令牌调用webapp2.xyz.com api webapp1.xyz.com具有SPA

    • 问题内容: 您能否分享您的想法,如何在MongoDB中实现数据版本控制。(我也曾问过有关Cassandra的类似问题。如果您有任何想法,哪个数据库更好,请分享) 假设我需要在一个简单的通讯簿中对记录进行版本控制。(地址簿记录存储为平面json对象)。我希望这段历史: 将很少使用 将一次全部使用,以“时间机器”的方式呈现 一个记录不会有超过几百个的版本。历史不会过期。 我正在考虑以下方法: 创建一个