2012-07-19 59 views
5

我正在研究Java中的系統,其中的一部分將表達式從內部表示呈現到MongoDb查詢。我呈現「AND」表達式的方式與呈現「OR」表達式的方式相同。

{$and:[{"category":"GIBBLY"},{"active":true}]}

我明白,這不是絕對必要在這種情況下:如果我有一個像「一類=‘GIBBLY’和積極=真實」的表達,將它作爲渲染。我無法弄清楚是否有這種情況下,$和是必要的(在我的系統中,如果有區別的話,通常會有嵌套的AND和OR)。

這對我來說是個問題,原因是$和operator對於地理空間查詢似乎失敗了。像這樣的查詢:

{"$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. 爲什麼$和不適用於地理空間查詢?

+0

如果$ nearSphere是$和?中唯一的條件,它會發生錯誤嗎? – MrKurt 2012-07-19 16:03:32

+0

https://jira.mongodb.org/browse/SERVER-4572。我也找不到任何評論。 – pingw33n 2012-07-19 16:05:57

+0

是 - 如果$ nearSphere是唯一的條件,則會出現相同的錯誤。 – dkilmer 2012-07-19 16:23:02

回答

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中對地理空間信息的索引特殊限制。您的查詢可能不會以理想的方式使用索引。

+0

謝謝 - 甚至沒有想過JSON地圖的限制。我正在尋找一種方法來查看MongoDb查詢編譯到的內容,但找不到任何內容。正如上面提到的人,有一張票[這裏](https://jira.mongodb.org/browse/SERVER-4572)。因此,如果您正在閱讀此項目,因爲您受到該問題的影響,請確保升級票證。 – dkilmer 2012-07-20 16:14:08

3

在回答你的第一個問題,正如你指出,在查詢中使用逗號是隱式「和」:

db.collection.find({name: "Jenna", number: 1}) 

的$,當你需要把多個過濾器操作是必要的在單個字段上,這是使用逗號語法無法實現的。作爲一個例子,找到與含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票據。

+0

感謝您的非常清晰的描述。廢話 - 這種情況會不斷在我的系統中發生(基本上,「找到這個地區提供以下所有服務的所有提供商」)。我提出了票 - 希望他們會做這項工作。 – dkilmer 2012-07-19 16:55:52

+0

你能向我們展示一個你的查詢和你的數據的例子嗎?我認爲可以避免$ add操作符。 – Jenna 2012-07-24 01:20:55

+0

對不起 - 直到現在纔看到您的評論。問題查詢基本上與原始文章中的問題類似。真正的問題是MongoDb查詢是從表達式系統渲染出來的。 – dkilmer 2012-08-03 14:51:21