2011-12-26 96 views
0

我有一個mongoDB集合,其中有一個數組字段,用於表示用戶所屬的列表。在MongoDB中返回自定義字段

user { 
    screen_name: string 
    listed_in: ['list1', 'list2', 'list3', ...] //Could be more than 10000 elements (I'm aware of the BSON 16MB limits) 
} 

我現在用的是* listed_in *場拿到成員列表

db.user.find({'listed_in': 'list2'}); 

我還需要查詢特定的用戶知道他是否是特定列表的成員

var user1 = db.findOne({'screen_name': 'user1'}); 

在這種情況下,我將獲得其所有成員的* listed_in *字段。

我的問題是: 有沒有辦法預先計算mongoDB中的自定義字段? 我需要通過的* listed_in迭代*陣列知道,如果能夠得到這樣的領域,user1.isInList1user1.isInList2

現在我必須這樣做,在客戶端用戶是「list1」的成員,但* listed_in *可能有一千個元素。

+1

當你說你想得到像'user1.isInList1'這樣的結果時,這是否意味着你希望mongo爲每個存在的列表在文檔的根級設置一個布爾鍵?難道這不是很難預測嗎?你能解釋一下你想用最終結果對象完成的問題嗎?此外,如果您打算快速創建該文檔併爲listed_in編制索引,我相信索引列表的默認5k元素限制。你可以通過 – jdi 2011-12-26 22:52:15

+0

來提高它在哪裏可以找到更多關於索引列表的5k元素限制的信息?我以前沒有聽說過。 – aartiles 2011-12-27 07:48:11

+0

奇怪。我現在正在做我的第一個MongoDB項目,當我研究索引數組時,我發現信息表示索引數組有5k元素限制。現在,我再也找不到了。如果我是這樣的話,我很高興在這個問題上出錯:-) – jdi 2011-12-27 17:03:13

回答

0

我的問題是:有沒有辦法預先計算mongoDB中的自定義字段?

不是。 MongoDB沒有任何「計算列」的概念。所以你正在尋找的查詢不存在。

現在我有過* listed_in迭代做到在客戶端*知道數組,如果用戶的「列表1」的成員,但* listed_in *可能有一千元素

在你的情況下,你基本上試圖將客戶端for循環拖到服務器上。但是,有些過程仍然需要執行for循環。坦率地說,循環10k項目對於客戶端或服務器來說都不是那麼重要。

這裏唯一真正的節省是防止網絡上的額外數據。

如果您確實想要保存該網絡流量,則需要重新構建數據模型。這種重新結構可能會涉及兩個查詢來讀寫,但通過線路傳輸的數據較少。但這是一個折衷。

+0

是的,我關心的還是網絡流量。你能否給我更多關於你的想法的細節來重新構建模型? – aartiles 2011-12-27 07:51:08

+0

你基本上只是像在SQL中一樣建立一個「連接」表。所以你建立一個包含兩個字段的集合:'screen_name'和'list',然後你在兩個字段上索引。現在,您可以爲'screen_name/list'執行索引查詢,並且只返回最小數據集。權衡是你需要維護兩個數據副本*或*你需要接受其中一個查詢將是次優的。 – 2011-12-28 08:49:35

+0

每個列表最多可以有10M個成員。這是我第一個使用Mongo的項目,您認爲MongoDB能夠在超過10億個文檔的集合上正常工作嗎? – aartiles 2011-12-28 10:00:48

相關問題