2012-03-27 24 views
1

文獻結構(只是爲了說明)查詢基於嵌套文件的可用的部分數據(在嗎啡,mongodb的)

僱員

{ 
name : "..", 
age : .., 
addresses [ 
    { 
    "street":"...", 
    "country":{ 
     name:"..", 
     continent:"..", 
     Galaxy:".." 
    } 
    } 
], 
company:".." 
} 

查詢 -

我剛地址 - >街道(類型字符串)和地址 - >國家 - >名稱(類型字符串)。我想讓所有符合此標準的員工都能獲得。

Address a1 = new Address(); 
a1.setStreet("bla bla"); 
Country c = new Country(); 
c.setName("sth"); 
a1.setCountry(c); 

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1) 

DOES NOT獲取結果(而實際上有一個真正的比賽)。看起來像是因爲部分「國家」文件匹配。如果我填寫全部字段的國家其預期的結果。

問題1:上述的任何解決方法?

問題2:地址是一個數組,我可以得到多個(地址#街道,國家#名稱)對,再次我想要匹配給定對的僱員名單。 喜歡的東西:

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1).field("addresses").hasThisElement(a2).field(..) // and so on 

注:我可以擊穿地址匹配這樣的事情

Address a = new Address(); 
a.setStreet("bla bla"); 
q.createQuery(Employee.class).field("addresses").hasThisElement(a).field("addresses.country.name").equal("hoo"); 

但這將配合員工,其中街道=「喇嘛喇嘛」和country.name =「呼」了!地址#1和街道!=「bla bla」和country.name =「hoo」在地址#2中。你明白了。我不希望這樣的員工被退回。

請讓我知道這是否可能。非常感謝。

+0

你碰巧找到了解決這個問題的方法嗎? – 2014-02-10 08:57:47

回答

1

這是可能的。 MongoDB針對這種稱爲elemMatch的情況有一個特殊的操作符。 Morphia支持它。

第二種方法是正確的(第一種方法是試圖匹配整個國家而不是子項),這是正確的。唯一的事情是你想要限制它與一個單一的元素與街道和country.name匹配。不是具有匹配的街道和匹配的country.name的文檔。

此文檔頁和此線程有一些更多的信息。

http://code.google.com/p/morphia/wiki/Query

http://groups.google.com/group/morphia/tree/browse_frm/month/2011-02/5bd3f654526fa30b?rnum=41&lnk=ol

不幸的是,我不知道嗎啡好,但希望這會給你足夠的信息來解決這個問題。