2016-02-03 3 views
3

Я пытаюсь отфильтровать сбор данных, сделав запрос и сохранив результаты в меньшей коллекции. Однако количество записей, которые были найдены с использованием count() и числа в коллекции, сильно отличается (count() намного выше). Я делаю что-то неправильно?Mongodb find-> insert and count имеет отличные результаты

Это возвращает около 110 миллионов.

db.getCollection('ex').count({ 
    'data.points': {$exists: true}, 
    'data.points.points': {$exists: false}, 
}, { 
    'data.id': 1, 
    'data.author.id': 1 
}) 

Затем я выполняю это.

db.getCollection('ex').find({ 
    'data.points': {$exists: true}, 
    'data.points.points': {$exists: false}, 
}, { 
    'data.id': 1, 
    'data.author.id': 1 
}) 
.forEach(function (doc) { 
    db.s_uid_wid.insert(doc) 
}) 

Но это дает всего 5 миллионов записей. Они должны быть точно такими же. Что происходит?

db.getCollection('s_uid_wid').count({}) 

Редактировать

  • Раньше я работала в этом robomongo гуй и создавалось впечатление, что все было хорошо. Теперь я попытался это в Монго оболочки, и я получил эту

2016-02-04T00:39:21.735+0800 Error: getMore: cursor didn't exist on server, possible restart or timeout? at src/mongo/shell/query.js:116

+0

'COUNT()' не имеет 'projection' параметр –

+0

@AlexBlex, вы говорите о первой команде? Будет ли это влиять на результат подсчета? –

+1

Существует вероятность того, что вы столкнулись с ошибкой во время цикла .forEach, и в нее было вставлено до 5 миллионов записей. Попробуйте find() без forEach и посмотрите, что дает вам count() возвращаемого курсора. –

ответ

1

следующие исправления этой проблемы. Для завершения вставки требуется около одного дня.

db.getCollection('ex').find({ 
    'data.points': {$exists: true}, 
    'data.points.points': {$exists: false}, 
}, { 
    'data.id': 1, 
    'data.author.id': 1 
}).addOption(DBQuery.Option.noTimeout) 
.forEach(function (doc) { 
    db.s_uid_wid.insert(doc) 
}) 
Смежные вопросы