2012-04-18 19 views
0

不確定這是否可行,但在這裏。Java morphia - 按列表字段中的值查詢

我有一個MongoDB的(使用嗎啡來訪問它)有一個表像下面(簡化這個例子,但概念是相同的):

{ Name : "Robert", NickNames : [ "Bob", "Twinkletoes" ] } 
{ Name : "Trevor", NickNames : [ "Bob", "Mad man", "Tweedledee" ] } 
{ Name : "Samuel", NickNames : [ "Sam" ] } 
{ Name : "Patrick", NickNames : [ "Bob", "Mad man" ] } 
{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] } 

而對於這個例子的目的,讓我們說暱稱總是按字母順序排列,暱稱所在的位置是相關的。

所以,我們可以看到每個人的記錄在列表中可以有不同數量的暱稱。我如何可以執行以下搜索:

  • 給我所有的人以第一暱稱「鮑勃」,第二個綽號「瘋子」(即Person.Nicknames [0] =「鮑勃」 & &人。暱稱[1] =「瘋子」)

    應該返回2條記錄 - Trevor和Patrick。

  • 給我所有的人以第一暱稱 「鮑勃」(即Person.Nicknames [0] = 「鮑勃」)

    應該返回3個記錄 - 羅伯特,Trevor和帕特里克。

注意,馬克並沒有返回,因爲他在他的「鮑勃」的綽號在第一索引沒有。

有沒有辦法做到這一點?

回答

3

一旦元素插入到一個數組,他們的訂單將被保留。

,你希望他們的查詢應該工作:(_id略去了)

> db.people.find({"NickNames.0":"Bob", "NickNames.1":"Mad man"}, {_id:0}) 
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] } 
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] } 
> db.people.find({"NickNames.0":"Bob"}, {_id:0}) 
{ "Name" : "Robert", "NickNames" : [ "Bob", "Twinkletoes" ] } 
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] } 
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] } 
> 

有一個簡短的說明對此次在「數組元素的位置」「點符號的節(晚晴into Objects)「文檔: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition

以上是在JS shell中完成的。我對Morphia不熟悉,因此您必須自己將查詢翻譯成正確的Morphia語法。希望這可以幫助!

+1

已經足夠接近我的答案,謝謝!轉換爲morphia時的實際查詢如下所示:*** query.field(「NickNames.0」)。equal(「Bob」); ***請注意,您必須禁用對查詢的驗證才能使其正常工作(** query.disableValidation()**) – 2012-04-18 20:48:36

0

該位置是否相關?第一個查詢是否也可以找到以下內容?

{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] } 

如果確切位置是不相關的,你可以使用hasThisElementhasAllOf(只有相關部分):

.field("NickNames").hasThisElement("Bob") 
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings)) 
+0

不幸的是,這個位置與我的情況相關。讓我更新我的問題,以反映這 – 2012-04-18 08:24:07

+0

然後我不知道。我甚至不確定Morphia/MongoDB會保證保留您的訂單(他們通常會這樣做,但不確定是否總是這樣)。 如果訂單得到保證,您可以使用limit(2)''獲取前兩個條目(如果您不想從第一個條目開始,使用''offset()'')並檢查列表Java的''contains''。不漂亮,但可能是一種解決方法... – xeraa 2012-04-18 11:15:32

+0

這是一個遺憾。那麼我可能不得不重新訪問數據結構。 – 2012-04-18 14:39:17