2014-02-21 119 views
1

我在工作中有一個有趣的問題。我們有一個文檔的結構是這樣的:搜索嵌套在另一個文檔中的一組文檔

{ 
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3", 
"ssm" : { 
    "0168edb0-c25d-42ba-ba6d-918c4f61f6e1" : { 
     "xas" : [], 
     "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
     "we" : "bow-bq", 
     "gndr" : "M", 
     "lcd" : ISODate("2014-02-21T09:00:04.575Z"), 
     "re" : "tyjhgj", 
     "s" : "0168edb0-c25d-42ba-ba6d-918c4f61f6e1", 
     "scsv" : "testdata", 
     "sg" : { 
      "grd" : "FOUR", 
      "gdn" : "4" 
     }, 
     "sno" : "100000002", 
     "sss" : "Ha", 
     "stst" : { 
      "tk" : "226", 
      "tn" : "That" 
     }, 
     "tsd" : ISODate("2014-02-21T08:35:51.075Z") 
    }, 
    "016e48fa-5c24-4fd5-b078-5333991de013" : { 
     "xas" : [], 
     "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
     "we" : "dsgsdf", 
     "gndr" : "M", 
     "lcd" : ISODate("2014-02-21T09:04:11.995Z"), 
     "lia" : 53, 
     "re" : "ghjghjgh", 
     "s" : "016e48fa-5c24-4fd5-b078-5333991de013", 
     "scsv" : "testdata", 
     "sg" : { 
      "grd" : "FOUR", 
      "gdn" : "4" 
     }, 
     "sno" : "100000029", 
     "sss" : "Ha", 
     "stst" : { 
      "tk" : "86", 
      "tn" : "That" 
     }, 
     "tsd" : ISODate("2014-02-21T08:50:55.821Z") 
    }, 
    "076fc7ab-264b-4814-9f3a-db9f8222d02f" : { 
     "xas" : [], 
     "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
     "we" : "hjhyyio", 
     "gndr" : "M", 
     "lcd" : ISODate("2014-02-21T09:04:58.299Z"), 
     "lia" : 53, 
     "re" : "qsdrfg", 
     "s" : "076fc7ab-264b-4814-9f3a-db9f8222d02f", 
     "scsv" : "testdata", 
     "sg" : { 
      "grd" : "FOUR", 
      "gdn" : "4" 
     }, 
     "sno" : "100000003", 
     "sss" : "HA", 
     "stst" : { 
      "tk" : "161", 
      "tn" : "That" 
     }, 
     "tsd" : ISODate("2014-02-21T08:52:04.471Z") 
    }, 
"try" : "34534", 
"jyu" : ISODate("2014-03-01T07:59:59.000Z"), 
"poij" : ISODate("2014-01-08T08:00:00.000Z") 

} 
} 

顯然,這是已被編輯隱藏源數據,但結構是一樣的。

我正在嘗試編寫一個查詢,該查詢將在子文檔「ssm」中包含的子文檔的「s」字段上進行搜索。

我已經嘗試使用$ elementmatch以及使用標準點符號。我遇到的問題是,「ssm」字段更多地是子集合而不是子文檔。我有點失落,希望得到一些建議。

閱讀Mongo文檔我似乎無法找到任何方式來查詢子集合。谷歌向我展示了很多方法來查詢sud-documents的ARRAY,但這不是我在這裏處理的。

請幫忙!

回答

0

如您所知,您列出的項目是子文檔而不是數組的成員。因此,您不必知道嵌套級別中的鍵的組成,就可以引用底層值。

我參考this answer我的一點,都在同一個主題上,所以可能值得一讀。但是如果你想對它進行任何有意義的查詢分析,那麼這裏的數據結構就有很大的缺陷。因此,應該被改變,其他答案和你自己的發現應該是令人信服的理由。

有沒有簡單的解決方案來處理這樣的結構,this question和答案可以給出一些洞察到如何「發現」的關鍵名稱,以飼料查詢信息。但這將是一個艱苦的過程。

MongoDB的強大之處在於,它允許您通過更改更靈活的東西比關係設置。文件設計的靈活性給你「足夠的繩索掛上你自己」,重新設計往往是你的發展演變的必要條件。

將結構改爲有效的東西。

+0

謝謝!你證實了我的懷疑。我同意這種結構從根本上是錯誤的,我不太清楚爲什麼它是這樣設計的。不幸的是,這個決定高於我的薪酬等級。我會繼續嘗試指出設計中的缺陷,並希望有人會聽。這樣說,我還沒有嘗試使用展開功能,因爲你在你的其他答案。我會試一試,看看我能不能湊齊一些東西。最終,我很可能會回到我嘗試過的真正的python/pymongo組合上來解開集合的結構。再次感謝! – nrmjba

0

取而代之的是:

{ 
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3", 
"ssm" : { 
    "0168edb0-c25d-42ba-ba6d-918c4f61f6e1" : { 
     "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
     }, 
    }, 
    "016e48fa-5c24-4fd5-b078-5333991de013" : { 
     "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
    } 
} 

試試這個:

{ 
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3", 
"ssm" : [ 
      { 
      "name": "0168edb0-c25d-42ba-ba6d-918c4f61f6e1", 
      "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
      }, 
      { 
      "name": "016e48fa-5c24-4fd5-b078-5333991de013", 
      "dob" : ISODate("2001-01-01T00:00:00.000Z"), 
      } 
], 
"foo": "bar" 
} 

這樣的話,你可以搜索文件,其中有人有通過find(ssm.dob: date)一個DOB。一旦你找到你的文件,你仍然必須掃描子文件,看看哪一個匹配。

如果您不喜歡那樣,您需要創建每個someone作爲其他集合中的文檔。

+0

我同意這個結構是錯誤的。如果我有我的方式,我會改變它。不幸的是,這不是我的決定。感謝您看看它應該是什麼樣子的例子! – nrmjba