首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询多个值时忽略MongoDB查询

查询多个值时忽略MongoDB查询
EN

Stack Overflow用户
提问于 2014-02-27 15:44:24
回答 2查看 99关注 0票数 1

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

代码语言:javascript
复制
{
    otherKey: "1234"
    numArray: [3200, 3220, 3230, 5433],
    empBand: 4
}

我想查询基,因此我得到了文档,其中numArray包含介于3200到3220之间的任何值,并且empBand等于4。

我使用的查询是:

代码语言:javascript
复制
db.Data.find({ numArray: { $gte : 3200, $lte: 3220 }, empBand : 4})

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

但是,如果我运行以下命令:

代码语言:javascript
复制
db.Data.find({numarray: { $gte : 3200, $lte: 3220 }})

我得到了正确的结果,即只有包含数组(任意值)中一个值的文档,该值介于3200到3220之间。

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

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

我尝试使用$and编写查询,如下所示:

代码语言:javascript
复制
db.Data.find({$and: [ { numArray: { $gte: 3200, $lte: 3220 } }, { empBand: 4}])

但我还是得到了错误的结果。

暗示numArray的led指数仍然会得到错误的结果。

我是不是漏掉了什么显而易见的东西?

编辑:

以下是我在第二个查询中得到的结果:

代码语言:javascript
复制
{ "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 ] }

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

代码语言:javascript
复制
{ "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 ] }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-27 16:05:33

这篇文章的答案是:

蒙古问题$gt,$lt

我需要使用elemMatch:

代码语言:javascript
复制
db.Data.find({ numArray: { $elemMatch: { $gte: 3200, $lte: 3220 }}, empBand : 4})

得到正确的结果。

票数 0
EN

Stack Overflow用户

发布于 2014-02-27 15:55:39

我很漂亮你碰到了一个bug,更确切地说是服务器-1937:$gt/$lt/$ne与标量操作数生成数组上的不一致匹配

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22073368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档