MongoDb $和具有地理空间查询的运算符

时间:2012-07-19 15:28:26

标签: java mongodb

我正在使用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的讨论。

我发现的所有信息都没有真正解释为什么确切地说$并且不适用于地理空间查询。我的数据库中根本没有定义复合索引,非$和查询有效,所以我不确定$和索引的工作方式不同。

总结一下,我的问题是:

  1. $和是否有必要,如果有,是什么类型的情况?

  2. $和与索引的隐式表示有某些基本方式不同吗?

  3. 为什么$确实与地理空间查询无关?

2 个答案:

答案 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票证。