2012-03-28 36 views
2

我正在嘗試構建一個Mongo查詢,我可以根據子數組中的值來選擇文檔,其中嵌入數組的鍵將從文檔更改爲文檔。Mongo:查詢嵌套在子數組中的鍵值可變的值

在下面的例子中,我們有三個文檔數組。拉起每個酒的名字是微不足道的。當我想選擇品嚐結果大於20的葡萄酒時,問題出現了。問題在於,當我運行查詢時,我不知道航班的名稱;它可以是任何東西。

因此,我不能僅僅檢查嵌入數組的值。

我想過像

$ary_query = array('tasting_results.*' => '$gt: 20');

但顯然通配符不蒙戈工作(至少不是這樣的)。有任何想法嗎?

這裏的例子數組:

ary_wines = array(
"name" => "Ripple", 
"year" => "2013", 
"style" => "cabernet", 
"size" => "750ml", 
"tasting_results" => array (
    "flight_42" => 12, 
    "flight_2" => 18, 
    "flight_33" => 7 
    ) 
) 

ary_wines = array(
"name" => "Riunite", 
"year" => "2012", 
"style" => "White Zinfandel", 
"size" => "1.5L", 
"tasting_score" => array (
    "flight_6" => 14, 
    "flight_54" => 21, 
    "flight_98" => 3 
    ) 
) 

ary_wines = array(
"name" => "Maneschewitz", 
"year" => "2012", 
"style" => "Grape Juice", 
"size" => "500ml", 
"tasting_score" => array (
    "flight_7" => 12, 
    "flight_41" => 26, 
    "flight_9" => 3 
    ) 
) 

回答

2

那麼,在技術上你可以做一個表掃描樣式的查詢與$where條款:

db.wines.find({$where: function() { 
    var keys = Object.keys(this.tasting_score); 
    keys.forEach(function(key) { 
     if(this.tasting_score[key] > 20) { return true; } 
    }); 
    return false; 
}); 

但是,我懇求你,這是一個可怕想法,並且將數據以可索引的方式放入數據庫會更好,您可以使用標準查詢方法。具體怎麼做取決於應用程序如何操縱數據,但至少可以預先處理插入操作,並在對象中有參數maxTastingScore以查詢這是否是唯一的查詢,適合你的數據結構。

+0

感謝大衛,是啊,我在想什麼像這樣,但隨後丟棄它,因爲它似乎不能很好地擴展。所以,我想我需要改變我構建文檔的方式,基本上就是你所說的。 – DenverMatt 2012-03-28 01:15:02

+1

是的,如果您可以找到正確的文檔結構,MongoDB可以提高性能。如果沒有一個好的結構,那麼使用PostgreSQL或者在Neo4j的另一端更合理。但經過一番思考後,也許你可以用一個結構來做到這一點:''tasting_score:[{flight_num:7,score:20},{flight_num:18,score:7},...]''。然後你可以''db.wines.find({「tasting_score.score」:{$ gt:20}})''。當然,這取決於你打算做什麼其他查詢。 – 2012-03-28 05:43:22

0

你可以嘗試單獨過濾項目並做類似OR的事嗎?

我沿着

"entities": { 
    "user_mentions": { 
    "0": { 
     "indices": { 
      "0": 0, 
      "1": 10 
     } 
    }, 
    "1": { 
     "indices": { 
      "0": 41, 
      "1": 51 
     } 
    } 
} 

行查詢可以看起來像這樣的結構:

{ 
"entities.user_mentions.indices.0": {$gt:10}, 
"entities.user_mentions.indices.1": {$gt:20} 
} 

同時,請參閱MongoDB wildcard in the key of a query