2017-02-15 75 views
0

我有一個集合,我不想僅訪問具有聚合查詢的特定子文檔。加速mongodb中的子文檔訪問

考慮文件,其中每個文件描述一個國家有每個城市的子文件。現在我只想訪問慕尼黑的子文檔。

{ 
_id: "123abc", 
name: "Germany", 
"someAttribute": ... 
cities: [ 
    { 
     "name": "Berlin", 
     "someAttribute": ... 
    }, 
    { 
     "name": "Munich", 
     "someAttribute": ... 
    }, 
    { 
     "name": "Bonn" 
    }, 
    ... 
] 
} 

我知道我可以添加一個索引來加速檢索包含慕尼黑相關子文檔的文檔。我正在尋找的是一種加快子文檔本身檢索的方法。因爲對於大文檔,mongodb需要很長時間才能掃描文檔並提取相關的子文檔。

回答

0

鑑於我們的MongoDB中這個文件

{ 
    _id: "123abc", 
    name: "Germany", 
    "someAttribute": ["a","b","c"], 
    cities: [ 
     { 
      "name": "Berlin", 
      "someAttribute": ["a","b","c"] 
     }, 
     { 
      "name": "Munich", 
      "someAttribute": ["a","b","c"] 
     }, 
     { 
      "name": "Bonn" 
     } 
    ] 
} 

然後,我們可以做到以下幾點聚集查詢

db.test.aggregate([ 
    { $match: { "cities.name" : "Berlin" } }, 
    { $unwind: "$cities" }, 
    { $match: { "cities.name" : "Berlin" } }, 
    { $project: { "city" : "$cities" } } 
]); 

這將限制返回文檔只是城市的大小,從而節省帶寬和轉移時間。

但是,您應該確保cities.name有一個指數

db.test.createIndex({ "cities.name" : 1 }); 
+0

是 - 你的解決方案正是我有權知道。問題在於mongo仍然需要掃描文檔中的所有城市並找到正確的 - 我正在尋找一種方法讓mongo只讀取包含所需城市的文檔的相關部分。 –

+0

您的正確,mongodb會將整個文檔(但只有匹配的文檔)加載到內存中以對其執行操作。很確定沒有辦法解決這個問題,你可以用不同的方式爲你的文檔建模。 –