2014-09-26 61 views
1

我在我的mongodb上找到了一個,我也可以在pymongo中做到這一點。查詢嵌入式文檔中的特定鍵

db.myTest.find({ 「小區」: 「k12p125」})

{ 「_id」:的ObjectId( 「5425194479df354955015855」), 「細胞」: 「k12p125」
「的fileInfo 「:{」t50%「:95,」fName「:」file1「,」25%「:67,」min「:0,」50%「:70,」std「:23.155629597455047,」max「 「75%」:93「count」:42484「mean」:78.01871292721965}}

{「_id」:ObjectId(「5425197d79df3549550161e9」),「cell」:「k12p125」,「fileInfo」:{ t50%「:92,」fName「:」file2「,」25%「:69,」min「:0,」50%「:71,」std「:21.696940348452337,」max「:204,」75% :90,「count」:42484,「mean」:7 {「_id」:ObjectId(「542519b679df354955016b7d」),「cell」:「k12p125」,「fileInfo」:{「t50%」:95,「fName」:「file3」,「25% 「:66,」min「:0,」50%「:70,」std「:23.58083230514195,」max「:205,」75%「:94,」count「:42484,」mean「:77.98015723566519}}

我想要做的就是訪問嵌入式文檔。所以我有一個叫做「單元格」的鍵值和我正在尋找「k12p125」的值。我想要做的是查找單元格k12p125,然後提取出每個文件的所有「std」鍵以及每個文件的名稱。所以,我想要的信息是

細胞:k12p125
FNAME: 「文件1」,性病:23.155629597455047
FNAME: 「文件2」,標準:21.696940348452337
FNAME: 「文件3」,性病:23.58083230514195

並能夠使用pymongo檢索該信息。我還想知道,只要文件被排序,是否有辦法直接獲取每個文件的「標準」。我想

細胞:k12p125
STD:23.155629597455047
STD:21.696940348452337
STD:23.58083230514195

說出來會在文件(STD順序排序順序文件1性病,文件2 ,文件3)。請讓我知道你是否需要更多的澄清。我很難概念化如何訪問嵌入式文檔,所以任何幫助都會很棒。 謝謝!

回答

0

你不能得到準確的一個基本的查詢所需的輸出,但是你可以用一個簡單的投影和一種親近:​​

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.fName" : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : 1}) 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file1", "std" : 23.155629597455047 } } 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file2", "std" : 21.696940348452337 } } 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file3", "std" : 23.58083230514195 } } 

或者,相反的順序:

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.fName" : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : -1}) 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file3", "std" : 23.58083230514195 } } 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file2", "std" : 21.696940348452337 } } 
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file1", "std" : 23.155629597455047 } } 

您仍然有頂級文檔fileInfo來處理,但通常這很容易處理客戶端。

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : -1}) 
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.58083230514195 } } 
{ "cell" : "k12p125", "fileInfo" : { "std" : 21.696940348452337 } } 
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.155629597455047 } } 
db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : 1}) 
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.155629597455047 } } 
{ "cell" : "k12p125", "fileInfo" : { "std" : 21.696940348452337 } } 
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.58083230514195 } } 

您將要建立你的查詢模式是什麼,你在這兒可以索引正確:

然後,返回STD,同樣的排序仍然可以,即使你不凸出排序領域的應用。一個compound indexcell作爲最左邊的元素和嵌入字段的組合可能是你需要的,但是看起來像什麼將取決於你如何構建查詢到底。

相關問題