4

我不确定如何执行此任务

这是文档结构

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
}
4

2 回答 2

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.

于 2012-07-12T20:46:17.847 回答
2

由于在 MongoDB 2.1 中添加了聚合框架,您还可以执行以下操作:

db.collection.aggregate([ 
    {$match: {'date_created': {'$gte': '2011-01-01', '$lt': '2011-10-30'}}}, 
    {$sort: {name: 1}}, 
    {$group: {
        _id: '$name', 
        val: {$first: '$val'}
    }}
])
于 2012-11-12T19:12:16.417 回答