ensureIndex не дает возможности сделать это. Также не сообщается, какие значения будут удалены.
В вашем случае я бы попытался сделать следующее (что, безусловно, будет медленнее, чем обеспечить индекс). Я также предполагаю, что у вас есть какое-то поле (в моем случае created_at
), основанное на том, что вы решаете, является ли один документ старше другого):
var checked = {}; // basically a hash, which ensures O(1) lookup
db.coll.find().sort({created_at: -1}).forEach(function(o){
if (o['CUid'] in checked){
db.coll.remove({_id: o['_id']});
} else {
checked[o['CUid']] = 1;
}
})
Таким образом, в основном мы перебираем все ваши документы в обратном порядке (самый новый первый) и проверяем, видели ли мы уже ваше поле CUid
. Если у нас его нет, то оставляем этот документ как есть и отмечаем как просмотренный. Если позже мы увидим какой-либо другой документ с таким же CUid
, мы можем его удалить.
В итоге вы получите одно полное сканирование вашей коллекции и N
дополнительных вызовов базы данных для каждого дублированного элемента.
Обратная сортировка гарантирует, что будет сохранен самый новый элемент.
P.S.
Остерегайтесь ошибок в приведенном выше коде; Я только доказал, что это правильно, не пробовал.
и скажи мне, как это происходит.
P.P.S. если вы все еще не можете отсортировать все коллекции в монго, я бы попытался сделать это на прикладном уровне. По сути, вы находите все свои коллекции, сортируете их по любому языку, который хотите, а затем выполняете ту же логику и там.
18.02.2015
Runner error: Overflow sort stage buffered data usage of 33578371 bytes exceeds internal limit of 33554432 bytes
Кроме того, в базе данных около 300 тысяч записей, а ее размер составляет около 1,6 ГБ :-s 18.02.2015created_at
, потому что без индекса вы не можете использовать более 64 МБ (что для меня удивительно, так это то, что в вашем случае он отключается после 32 МБ) 18.02.2015