2014-12-05 63 views
3

我有一個Mongodb集合。簡單來說,它有兩列:用戶和網址。它有39274590行。這張表的關鍵是{user,url}。MongoDB獨特太大了16mb的帽子

使用Java,我嘗試列出不同網址:

MongoDBManager db = new MongoDBManager("Website", "UserLog"); 
    return db.getDistinct("url"); 

但是我收到一個異常:

Exception in thread "main" com.mongodb.CommandResult$CommandFailure: command failed [distinct]: 
{ "serverUsed" : "localhost/127.0.0.1:27017" , "errmsg" : "exception: distinct too big, 16mb cap" , "code" : 10044 , "ok" : 0.0} 

我怎樣才能解決這個問題?有沒有可以避免這個問題的計劃B?

謝謝。

+0

你有沒有找到一個解決方案? – gmaniac 2014-12-17 21:30:15

回答

1

在2.6版本中,你可以使用累計的命令來產生一個單獨的集合: http://docs.mongodb.org/manual/reference/operator/aggregation/out/

這將讓16MB左右的MongoDB的限制大多數查詢。您可以在這裏閱讀關於在mongodb 2.6中使用大型數據集上的聚合框架的更多信息: http://vladmihalcea.com/mongodb-2-6-is-out/

要對聚合框架執行「獨特」查詢,請按字段進行分組。

db.userlog.aggregate([{$group: {_id: '$url'} }]); 

注:我不知道這是如何工作的Java驅動程序,祝你好運。

3

看看這個answer

1)要做到這一點是通過聚合框架的最簡單方法。這需要兩個「$組」命令:第一個按不同的值分組,第二個分組統計所有不同的值。

2)如果你想用Map/Reduce來做到這一點,你可以。這也是一個兩階段的過程:在第一階段,我們建立一個新的集合,並列出每個不同價值的關鍵。在第二個我們對新集合做一個count()。

請注意,您無法返回map/reduce內聯結果,因爲這可能會超出16MB文檔大小限制。您可以將計算結果保存到集合中,然後count()集合的大小,或者可以從mapReduce()的返回值中獲取結果的數量。

1

如果您使用的是mongodb 3.0及以上版本,則可以使用 DistinctIterable類和batchSize。

MongoCollection coll = null; 
coll = mongodb.getCollection("mycollection"); 
DistinctIterable<String> ids = coll.distinct("id", String.class).batchSize(100); 
for (String id: ids) { 
    System.out.println("" + id); 
} 

http://api.mongodb.com/java/current/com/mongodb/client/DistinctIterable.html