我有一个文档结构,其中包含一个简单的整数数组和另一个数字键,类似于:
{
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索引,就像第一个标准被完全忽略一样。
我尝试使用$编写查询,因此:
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 ] }
答案 0 :(得分:0)
我很高兴你遇到了一个错误,更具体地说是SERVER-1937: $gt/$lt/$ne with scalar operand yields inconsistent matches on arrays
答案 1 :(得分:0)
这篇文章有答案:
我需要使用elemMatch:
db.Data.find({ numArray: { $elemMatch: { $gte: 3200, $lte: 3220 }}, empBand : 4})
获得正确的结果。