我正在使用Java系统,其中一部分将表达式从内部表示呈现给MongoDb查询。我渲染“AND”表达式的方式与呈现“OR”表达式的方式相同。因此,如果我有一个类似“category ='GIBBLY'和active = true”的表达式,它将呈现为:
{$and:[{"category":"GIBBLY"},{"active":true}]}
据我所知,在这种情况下,这并非绝对必要。我无法弄清楚的是,曾经是否需要$并且是必要的(在我的系统中,通常会有嵌套的AND和OR,如果这有任何区别的话)。
这对我来说是个问题的原因是$和运算符似乎无法进行地理空间查询。像这样的查询:
{"$and":[{"loc":{"$nearSphere":[-79.75 , 43.5], "$maxDistance":0.00156787}}, {"active":true}]}
失败,出现“无法找到特殊索引:2d”错误。如果我重新执行查询:
{"loc":{"$nearSphere":[-79.75 , 43.5], "$maxDistance":0.00156787}, "active":true}
它工作正常。
我尝试做一些研究,并找到了对on the mongodb-user group问题的讨论,其中提到了对compound indexes in geospatial queries的讨论。
我发现的所有信息都没有真正解释为什么确切地说$并且不适用于地理空间查询。我的数据库中根本没有定义复合索引,非$和查询有效,所以我不确定$和索引的工作方式不同。
总结一下,我的问题是:
$和是否有必要,如果有,是什么类型的情况?
$和与索引的隐式表示有某些基本方式不同吗?
为什么$确实与地理空间查询无关?
答案 0 :(得分:4)
是$并且是必要的,如果是的话,在哪种情况下?
这是经典的SQL
SELECT * FROM Table
WHERE (x = 1 OR y = 0)
AND (w = 1 OR z = 0)
在$and
运营商之前,这很难做到。您无法执行以下操作:
db.Table.find({$or: [{x:1},{y:0}] , $or: [{w:1},{z:0}]})
查询“看起来”正确,但它是无效的JSON。你会注意到我有两个顶级$or
键。该逗号应该代表“和”,但在这种情况下它不起作用。
$and
运算符旨在解决此问题。
$和与索引的隐式表示有某些基本方式不同吗?
它应该编译为相同的基本查询并使用相同的索引。如果没有,这肯定是一个错误。
为什么$确实与地理空间查询无关?
您看到的行为可能是一个错误,应该报告:http://jira.mongodb.org/
另外,请注意MongoDB对地理空间索引有特殊限制。您的查询可能没有以理想的方式使用索引。
答案 1 :(得分:3)
在回答您的第一个问题时,正如您所指出的,在查询中使用逗号是隐含的“和”:
db.collection.find({name: "Jenna", number: 1})
当您需要在单个字段上放置多个过滤器时,$ and运算符是必需的,这是使用逗号语法无法实现的。例如,要查找包含数字2 和数字10的数组的所有文档,您需要$和运算符:
文件:
{_id: 1, array: [1, 10]}
{_id: 2, array: [2, 10]}
查询:
> db.collection.find({$and: [{array: 2}, {array: 10}]})
{_id: 2, array: [2, 10]}
而没有$和运算符的查询只使用“array:10”并返回两个文档:
> db.collection.find({array: 2, array: 10})
{_id: 1, array: [1, 10]}
{_id: 2, array: [2, 10]}
使用$和运算符应该对索引没有影响。将使用单个索引来满足查询。
如果它影响您的查询,请随意投票与$和地理空间查询相关的JIRA票证。