2016-03-28 85 views
3

我重複刪除代碼(在MongoDB中殼)是這樣的:MongoDB的錯誤而刪除重複

db.<collection_name>.aggregate([ 
    { 
     $group: { 
      _id: { <duplicated_keys>: "$<duplicated_keys>" }, 
      dups: { $addToSet: "$_id" }, 
      count: { $sum: 1 } 
     } 
    }, 
    { 
     $match: { 
      count: { $gt: 1 } 
     } 
    } 
], { allowDiskUse: true }) 
.forEach(function(doc) { 
    doc.dups.shift(); 
    db.<collection_name>.remove({ _id: { $in: doc.dups } }); 
}); 

而且我有這樣的錯誤:

[thread1] Error: getMore command failed: { 
     "ok" : 0, 
     "errmsg" : "Cursor not found, cursor id: 144931661890", 
     "code" : 43 
} 

是什麼原因這個錯誤?我怎麼能解決這個問題?

UPDATE

  • MongoDB的版本是3.2
  • forEach之前,其結果是:

    { "_id" : { <duplicated_keys>: <dupkey_values> }, "dups" : [ ObjectId("56f8e4d37a88ea2aa938414d"), ObjectId("56f63ab87a88ea141ca33856") ], "count" : 2 } 
    

    如果我有ObjectId("56f63ab87a88ea141ca33856")發現,它是複製文件。

  • 數據量相對較大(30+ GB),這可能是問題嗎?
  • 在運行查詢時,存在對同一個集合的插入。
+0

@zangw嗨,thx回覆。不,不是'_id',他們是一些其他的領域使文件重複。 – xiGUAwanOU

+0

@zangw我更新了我的問題。 – xiGUAwanOU

+0

@zangw奇怪......這可能是因爲大量的數據(30 + GB)?遊標的大小是否有限制? – xiGUAwanOU

回答

5

最後找出解決方案。 MongoDB中的遊標有一個生命期,默認情況下是10分鐘。一旦超過這個時間,shell就不能再找到下一個遊標了。

要避免這種情況,請將光標的使用壽命設置爲noCursorTimeout()。例如:

db.<collection_name>.aggregate([ 
    { 
     $group: { 
      _id: { <duplicated_keys>: "$<duplicated_keys>" }, 
      dups: { $addToSet: "$_id" }, 
      count: { $sum: 1 } 
     } 
    }, 
    { 
     $match: { 
      count: { $gt: 1 } 
     } 
    }, 
    { 
     $out: "tempCollection" 
    } 
], { allowDiskUse: true }); 

db.tempCollection.find().noCursorTimeout().forEach(...); 

或使用較少的批量大小。例如:

db.<collection_name>.aggregate([ 
    { 
     $group: { 
      _id: { <duplicated_keys>: "$<duplicated_keys>" }, 
      dups: { $addToSet: "$_id" }, 
      count: { $sum: 1 } 
     } 
    }, 
    { 
     $match: { 
      count: { $gt: 1 } 
     } 
    }, 
    { 
     $out: "tempCollection" 
    } 
], 
{ 
    allowDiskUse: true, 
    cursor: { batchSize: 0 } 
}); 

db.tempCollection.find().forEach(...); 
0

非常感謝您分享您的發現。我得到了同樣的錯誤,並添加noCursorTimeout()幫助處理我的數據。

+1

只是爲了讓你高興起來,每個答案下面都有一個「添加評論」按鈕,這對於像這樣的小評論來說更好;) – JoeRocc

+0

@BJ_不寫回答說謝謝...也不說評論謝謝,只是投票答案 – Roberto