【问题标题】:MongoDB: find unique documents between date range in a collectionMongoDB:在集合中的日期范围之间查找唯一文档
【发布时间】:2012-07-12 20:35:21
【问题描述】:

我不确定如何执行此任务

这是文档结构

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
}

【问题讨论】:

  • 您想要唯一的文档,还是该范围内的 count 个唯一文档?
  • 我想要独特的文件,很抱歉造成混淆,我更改了描述

标签: mongodb


【解决方案1】:

好像可以用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 中拥有您唯一的文档。

【讨论】:

  • 这太棒了,一旦我完成了一切,我就得到了答案,非常感谢@Sergio
【解决方案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'}
    }}
])

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多