gpt4 book ai didi

mongodb - Mongodb 在隐式 AND 中发现方法混淆

转载 作者:可可西里 更新时间:2023-11-01 09:36:26 26 4
gpt4 key购买 nike

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

我的收藏 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 行收藏:

  • index 的值范围从 1 to 20 .
  • 对于 index 的每个值有20具有不同 _id 值的条目。

考虑到它们都是 implicit AND,我正在尝试以下两个操作并期待相同的结果例。

计算偶数 index值大于 5 的值。

  • 使用经典的 EXPLICIT 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]}
    });

没有提到 implicit OR在 mongoDB 文档中(或者至少我没有找到像 implicit AND 这样的直接引用)。

在这两种情况下,我都期待相同数量的记录 ( 160 )。我无法理解为什么上述代码的行为不同。

此外,条件规范的顺序会导致不同数量的结果。根据观察,当多次指定同一字段时,仅应用查找中指定的最后一个条件。 这很奇怪而且不正确。

注意:我正在使用 Mongo-DB-2.6代码正在 mongo shell 上执行随发行版一起提供。

最佳答案

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 }
});

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

关于mongodb - Mongodb 在隐式 AND 中发现方法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com