2011-05-30 317 views
28

是否有可能在查詢中通配符?例如,考慮下面的記錄,我喜歡做.find({'a.*': 4}) 這是這裏https://jira.mongodb.org/browse/SERVER-267討論,但它看起來像它沒有得到解決。MongoDB通配符在查詢中的鍵

{ 
    'a': { 
    'b': [1, 2], 
    'c': [3, 4] 
    } 
} 
+0

我與mongo有同樣的問題。我有很多這樣的文檔:{one:{two:{more:data},{more:data}}} 一旦你進入文檔樹一級,第二級的每個節點都是一個容器對於結構一致的文檔。所以我想能夠像這樣搜索:find({'one。*。some.data':5}) – rev 2012-01-05 20:41:25

回答

10

如問,這是不可能的。您鏈接到的服務器問題仍在「我們不確定的問題」

MongoDB中具有一定的智能周邊數組的使用,我認爲這是周圍這樣的功能複雜的一部分。

以下面的查詢db.foo.find({ 'a.b' : 4 })。該查詢將匹配以下文檔。

{ a: { b: 4 } } 
{ a: [ { b: 4 } ] } 

那麼在這裏做什麼「通配符」? db.foo.find({ a.* : 4 })它與第一個文檔相匹配嗎?第二個呢?

此外,這是什麼意思的語義?正如您所描述的,查詢實際上是「查找文檔中該文檔中任何字段的值爲4」的文檔「。這有點不尋常。

是否有一個特定的語義,你想達到什麼目的?也許文檔結構的變化會讓你得到你想要的查詢。

+0

謝謝,澄清。更具體地說,我期望做的是通配符,只是分支中的特定節點,即a的任何合適的子字段。我不清楚如何。*說'找到任何領域'。是不是'找到具有與4'匹配的子字段的頂級字段'a'的文檔? – Brad 2011-06-01 05:48:23

+0

我認爲這裏的困惑是圍繞「子領域」。當我寫'{a:{b:4,c:2}}'時,我的意思是'a'的值是一個JSON對象。那個JSON對象有兩個鍵'b'和'c'。這些密鑰的值分別是4和2。當你要求'a。*'時,你實際上要求的語法循環遍歷該JSON對象中的所有鍵。你不要求*「循環訪問一個數組」*,你要求*「遍歷一個對象的屬性」*。這有點不尋常,這就是爲什麼我在這裏要求一個特定的用例。 – 2011-06-01 17:15:19

+2

@gates:我有一個用例。 myDocInMongo = {'someUnknownKey':{propToCheck:true},'someKnownKey':true}; 現在,我想使用選擇器{someKnownKey:{$ exists:true}}來查找此文檔,但我也想確保其他任何鍵都不具有屬性propToCheck的對象。因此,如下所示: {'* .propToCheck':{$ exists:false},{someKnownKey:{$ exists:true}}} – doubletap 2012-05-03 17:57:25