2012-02-02 84 views
3

我正在用mongoDB作爲後端構建一個web應用程序。有些文件需要在某種列表中存儲項目集合,然後系統需要經常檢查列表中是否存在指定的項目。使用Python的'in'運算符需要Big-O(N)時間,n是列表的大小。由於這些列表可能會變得很大,我想要比這更快的東西。 Python的'set'類型在常量時間內執行這個操作(並且強制唯一性,這在我的情況中是很好的),但是被認爲是放入MongoDB的無效數據類型。Mongodb與Python的「set()」類型

那麼最好的辦法是什麼?有什麼方法可以使用常規列表並利用mongo的索引功能?同樣,我想知道,對於集合中的給定文檔,該文檔中的列表是否包含特定元素?

+2

請注意,Big-O(n)時間*是*線性時間,並且'set'在平均情況下(即* constant * time)在Big-O(1)時間內起作用。然而,'set'在最壞的情況下仍然是Big-O(n)時間(它也可能是Big-O(log n)最差的時間,但我認爲Python的是O(n)...) – cha0site 2012-02-02 17:01:39

+0

最壞的情況是隻有當你有100%的碰撞。它作爲一個Hastable來實現,它和字典一樣多(1)。 – 2018-02-14 16:24:27

+1

@ cha0site對不起,我打算寫*常量*時間,而不是*線性*。我糾正了它 – 2018-02-14 19:39:44

回答

3

您可以使用字典來表示一個集合。您的元素成爲關鍵字,並且所有值都可以設置爲常數,例如1. in運算符檢查鍵是否存在。

編輯。 MongoDB將字典存儲爲BSON文檔,其中的鍵必須是字符串(帶有一些額外的限制),因此上述建議的用途有限。

+0

哦,這是天才!爲什麼這是允許的,但'set'類型是不允許的?我認爲這與數據類型的散列能力或無法處理有關,但是字典是否被允許是沒有意義的。我真的認爲我想出瞭如何讓mongo索引內部元素列表的元素,所以我可以做對數時間查詢「find some item of some id which has some element in its list」,並且我可以檢查查詢返回一個遊標或null。但感謝提示,我可能會在稍後使用它。 – 2012-02-03 02:42:13