2013-05-13 27 views
1

我有一個數百萬文件的集合,我需要找到至少重複的文檔。重複標準基於2個鍵,而不是一個。所以我需要找到至少兩個文件,它們都有{ property1 : value1, property2 : value2,}我如何獲得由mongo集合中的2個鍵標識的重複元素?

爲此,我想使用的總framewotk如下面的例子:

db.listings.aggregate({ 
$group: 
{ 
    _id : { property1 : "$property1",  property2 : "$property2" }, 
    count: { $sum: 1 } 
},},{ 
$match : { 
count: { 
    $gt : 1 
} 
}},{ 
$limit: 1}) 

我想這應該是工作,但 蒙戈返回以下錯誤:

{ 
    "code" : 16390, 
    "ok" : 0, 
    "errmsg" : "exception: sharded pipeline failed on shard shard1: { errmsg: \"exception: aggregation result exceeds maximum document size (16MB)\", code: 16389, ok: 0.0}" 

我也試過

db.collection.aggregate({ $group: { _id: 
           { $concat: [ "$property1", 
              ": ", 
              "$property2" 
              ] 
           }, 
          count: { $sum: 1 } 
         } 
       } 
      ) 

得到了同樣的結果

有沒有人有更好的主意如何做到這一點?我不是一個真正的孟戈專家,但我必須這樣或那樣做。

在此先感謝

+0

在第一個_ $ group_之後,所有結果必須分組到一些_mongos_實例中,因此您的_ $ limit_命令沒有多大幫助。 – vinipsmaker 2013-05-13 21:12:24

回答

1

你的點子與$concat儘可能縮小文檔是一個很好的,但$concat$project運營商,而不是運營商$group。所以嘗試這樣的:

db.collection.aggregate(
    { $project: { _id: { $concat: ["$property1", ":", "$property2"] }}}, 
    { $group: { _id: '$_id', c: { $sum: 1 }}}, 
    { $match: { c: { $gt: 1 }}}) 

它仍然可能會使用太多的內存,但它是值得一試。

+0

謝謝大家的幫助。到目前爲止,JhonnyHK的回答確實對我有幫助,並沒有再次返回最大尺寸錯誤。非常感謝 – vali83 2013-05-16 06:52:10

相關問題