2012-07-12 66 views
4

我不知道如何執行此任務MongoDB的:找到日期範圍之間唯一的文檔集合在

這裏是文檔結構

name: 
date_created: 
val: 

我需要找出January 2011 and October 2011

之間創造的唯一文件

我知道我可以找出兩個日期範圍之間的文件數量爲

db.collection.find({'date_created': {'$gte': '2011-01-01', '$lt': '2011-10-30'}}); 

,我可以知道不同的

db.runCommand({'distinct': 'collection', 'key': 'name'}) 

問題

的問題是,裏面有收集重複的文檔,我需要刪除。

我該如何回答這個問題?

find out unique documents created between January 2011 and October 2011 where uniqueness is based on 'name' key 

UPDATE

@Sergio ansewer是完美的,在運行查詢後,我得到了下面的結果,它可以看出,output number < input number這意味着重複被拆除

{ 
    "result" : "temp_collection", 
    "timeMillis" : 1509717, 
    "counts" : { 
     "input" : 592364, 
     "emit" : 592364, 
     "output" : 380827 
    }, 
    "ok" : 1 
} 
+0

你想要獨一無二的文件,或**的範圍內的唯一文件數**? – 2012-07-12 20:37:54

+0

I wan獨一無二的文件,對不起,我更改了描述 – daydreamer 2012-07-12 20:41:04

回答

6

似乎它可以通過map-reduce來解決。像這樣的東西應該有所幫助。

var map = function() { 
    emit(this.name, this); 
} 

var reduce = function(key, vals) { 
    // vals contains all documents for this key (name). Just pick one. 
    return vals[0]; 
} 

db.runCommand({ 
    mapreduce: 'collection', 
    map: map, 
    reduce: reduce, 
    query: {'date_created': {'$gte': '2011-01-01', '$lt': '2011-10-30'}}, 
    out: 'temp_collection' 
}); 

該命令返回後,您應該在temp_collection中擁有唯一的文檔。

+0

這是真棒,一旦我完成了eveything,我得到了答案,謝謝很多@Sergio – daydreamer 2012-07-12 21:22:38

+0

你應該接受然後(也許upvote;)) – 2012-07-12 21:24:23

+0

做到了這兩個,再次感謝! – daydreamer 2012-07-12 21:25:08

2

因爲MongoDB中2.1添加aggregation framework的,你也可以這樣做:

db.collection.aggregate([ 
    {$match: {'date_created': {'$gte': '2011-01-01', '$lt': '2011-10-30'}}}, 
    {$sort: {name: 1}}, 
    {$group: { 
     _id: '$name', 
     val: {$first: '$val'} 
    }} 
]) 
相關問題