2015-11-10 132 views
0

在我们收集的多次出现,有结构,如:删除同一对象

Object: //below is object metadata from mongo 
    _id 
    created_at 
    lang 
    source 
    object: //this is real object data from our db 
     id 
     created_at 
     object_class 

我跑下面的查询在此集合:

db.getCollection('foo').aggregate(
    [ 
    { 
     $match: { 
      lang: 'bar', 
      pushed_at:{ 
      $gte: new ISODate("2015-11-09T00:00:00.000Z"), 
      $lt: new ISODate("2015-11-10T00:00:00.000Z") 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: "$object.id", 
      occurences: {$sum: 1} 
     } 
    }, 
    { 
     $match: { 
      occurences: {$gt: 1} 
     } 
    } 
]) 

其中返回: Alt text

看样子我们收集到的重复条目。重复我的意思是相同的对象Object.object.id。 我想使用我使用的agreggate函数的结果去除多余的出现。 请注意,我不想删除任何东西,只是冗余的,所以以上汇总返回occurences: 1

如何做到这一点,也使用聚合结果?

+0

您可以编辑您的问题包括[最小,完整,可验证的示例](http://stackoverflow.com/help/mcve) ,即一些样本数据恰好足以产生期望的结果以及该样本数据的预期输出? – chridam

回答

1

我想你可以尝试在shell:

db.foo.aggregate(
    [ 
    { 
     $match: { 
      lang: 'bar', 
      pushed_at:{ 
      $gte: new ISODate("2015-11-09T00:00:00.000Z"), 
      $lt: new ISODate("2015-11-10T00:00:00.000Z") 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: "$object.id", 
      occurences: {$sum: 1} 
     } 
    }, 
    { 
     $match: { 
      occurences: {$gt: 1} 
     } 
    } 
]).result.forEach(function(x) { 
    if(x.occurences > 1) { 
     for(i=0;i<x.occurences - 1;i++) { 
      db.foo.remove({"object.id":x._id}, true); 
     } 
    } 
} 
); 
+1

谢谢!这有很大帮助! – ex3v

+0

很高兴听到它! –

+0

对不起侧面的问题,但我想知道是否可以在以前的查询结果中调用像find()这样的方法? – ex3v