我不确定如何执行此任务
这是文档结构
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
}
答案 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'}
}}
])