MongoDB:在集合中的日期范围之间查找唯一文档

时间:2012-07-12 20:35:22

标签: 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

更新

@Sergio ansewer是完美的,在运行查询后,我得到了以下结果,可以看出output number < input number这意味着删除了重复项

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

2 个答案:

答案 0 :(得分: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中拥有唯一的文档。

答案 1 :(得分: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'}
    }}
])