【问题标题】:MongoDB query ignored when querying more than one value查询多个值时忽略 MongoDB 查询
【发布时间】:2014-04-23 16:38:38
【问题描述】:

我有一个文档结构,其中包含一个简单的整数数组和另一个数字键,类似于:

{
    otherKey: "1234"
    numArray: [3200, 3220, 3230, 5433],
    empBand: 4
}

我想查询基数,以便获取 numArray 包含介于 3200 和 3220 之间的任何值且 empBand 等于 4 的文档。

我使用的查询是:

db.Data.find({ numArray: { $gte : 3200, $lte: 3220 }, empBand : 4})

然而,这个查询完全忽略了 numArray 标准,并带回了 empBand 等于 4 的随机文档。

如果我运行以下命令:

db.Data.find({numarray: { $gte : 3200, $lte: 3220 }})

我得到了正确的结果,即仅包含数组中的值(任何值)的文档,该值介于 3200 和 3220 之间。

我为其他查询的两个值都设置了索引,使用 explain() 我可以看到仅在 numArray 上运行的查询所使用的索引是 numArray_empBand_otherKey 索引。

在初始查询中使用 explain() 告诉我正在使用的索引是 empData_otherKey 索引,而不是预期的 numArray_empBand 索引,就好像第一个条件被完全忽略了一样。

我已经尝试使用 $and 来编写查询:

db.Data.find({$and: [ { numArray: { $gte: 3200, $lte: 3220 } }, { empBand: 4}])

我仍然得到错误的结果。

使用 numArray led 索引提示仍然会得到错误的结果。

我是否遗漏了一些非常明显的东西?

编辑:

这些是我通过第二个查询得到的结果:

{ "numArray" : [ 3210, 46380, 47230 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210, 3220 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3110, 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }
{ "numArray" : [ 3210 ] }

以下是第一个查询的一些结果:

{ "empBand" : 4, "numArray" : [ 21250, 2522, 7487 ] }
{ "empBand" : 4, "numArray" : [ 1110, 45112 ] }
{ "empBand" : 4, "numArray" : [ 1130, 10390 ] }
{ "empBand" : 4, "numArray" : [ 1470, 46330 ] }
{ "empBand" : 4, "numArray" : [ 17510, 1753 ] }
{ "empBand" : 4, "numArray" : [ 1490, 93199 ] }
{ "empBand" : 4, "numArray" : [ 1500, 49410, 77390 ] }
{ "empBand" : 4, "numArray" : [ 1190, 43390 ] }
{ "empBand" : 4, "numArray" : [ 15310, 1533 ] }
{ "empBand" : 4, "numArray" : [ 1250, 1290, 10390, 46310 ] }
{ "empBand" : 4, "numArray" : [ 1610, 43999 ] }
{ "empBand" : 4, "numArray" : [ 3110, 47230 ] }
{ "empBand" : 4, "numArray" : [ 1621, 47799 ] }
{ "empBand" : 4, "numArray" : [ 1130, 16290, 38320, 91030 ] }
{ "empBand" : 4, "numArray" : [ 28520, 2875 ] }
{ "empBand" : 4, "numArray" : [ 1130, 47789 ] }
{ "empBand" : 4, "numArray" : [ 28520, 2875, 3663 ] }
{ "empBand" : 4, "numArray" : [ 27510, 2754, 2912 ] }
{ "empBand" : 4, "numArray" : [ 1190, 1290, 1630, 46220 ] }

【问题讨论】:

  • 您能否向我们展示一些您认为错误的结果?请编辑您的问题以包括这些

标签: arrays mongodb


【解决方案1】:

我很高兴你遇到了一个错误,更具体地说是SERVER-1937: $gt/$lt/$ne with scalar operand yields inconsistent matches on arrays

【讨论】:

    【解决方案2】:

    这篇文章有答案:

    Mongo Query question $gt,$lt

    我需要使用 elemMatch :

    db.Data.find({ numArray: { $elemMatch: { $gte: 3200, $lte: 3220 }}, empBand : 4})
    

    哪个会得到正确的结果。

    【讨论】:

    • 你是对的。我刚刚经历了一次无用的汇总练习,得出了同样的结论。问题是,如果没有$elemMatch 约束,您了解 为什么 范围 会失败的原因吗?
    • 在阅读了链接的帖子之后,约束被单独应用于数组中的元素是有意义的,因此数组中至少有一个元素匹配 $gte 并且至少有一个匹配 $lte。
    • 好的。我自己没有读过那个,但似乎你有基本的“向前扫描和向后扫描”的理解。 $elemMatch 将其缩减为在数组中实际上匹配的集合。
    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2012-05-11
    相关资源
    最近更新 更多