2013-07-17 2 views
0

У меня есть приложение, которое работает на NodeJS, и использует MongoDB в качестве базы данных для получения информации.NodeJS - это Mongoose быстрее, чем MongoJS?

В настоящее время я подключаюсь к MongoDB через модуль MongoJS, целью которого является «подражать официальному API-интерфейсу mongodb как можно больше».

Приложение получает около 20 000 объектов и сохраняет их каждый в MongoDB. Во-первых, он ищет базу данных, чтобы узнать, существует ли этот объект, затем он либо обновляет существующую запись, либо добавляет новую запись.

Это может быть довольно медленно. Я не уверен, что это потому, что MongoJS является синхронным/однопотоковым (если он даже есть - я не уверен!), Или это просто реальность записи большого количества записей в БД, но это занимает 45 минут-1 час чтобы сделать все это, и я, очевидно, хотел бы сократить это как можно больше.

Мне интересно, будет ли Mongoose лучшим вариантом для этого. По-видимому, это асинхронно, я не знаю, повлияет ли это на производительность.

ответ

3

Мое предположение - это шея бутылки - ваше приложение getting объектов. Если бы вы синтезировали поддельные объекты в ОЗУ и slam, а затем в mongo, вы, вероятно, стали бы более похожими на несколько сотен объектов в БД в секунду (грубое предположение, но по крайней мере на 2 порядка больше, чем 1/s, который вы требуете) , В обоих случаях FYI как MongoJS, так и Mongoose являются асинхронными, так как это почти каждый API базы данных узлов. На самом деле, AFAIK просто не имеет синхронного сетевого API в узле, поэтому, хотя можно задействовать узел в синхронном вводе-выводе файловой системы, все сетевые узлы могут быть по сути асинхронными.

В любом случае mongoose собирается добавить небольшое количество накладных расходов, поэтому он, вероятно, будет технически медленнее, чем mongojs, но не по какой-либо значимой сумме (например, требуется 5,1 секунды для вставки записей 20K против 5,0 секунд).

+0

Отличный ответ. Я отмечаю это как правильный ответ независимо от того, , но можете ли вы подробно остановиться на узком месте и какие шаги я могу предпринять, чтобы исправить это? Функция mongo вызывается в цикле 'for', который проходит через все мои продукты/объекты, у меня есть' process.setMaxListeners (0); 'но не знаю, что еще попробовать/где я столкнулся с проблемой. – Jascination

+0

Откуда берутся данные? Вот где я подозреваю, что это узкое место. Но вы также можете подумать о том, сколько одновременных операций вставки, которыми может управлять ваш монгод, и, возможно, дросселировать ваши вставки соответственно.Трудно спекулировать дальше, не имея более конкретных данных о вашей ситуации. –

+0

Я вижу. Данные поступают из веб-скребка, так что это, скорее всего, узкое место! Я просто хотел посмотреть, можно ли улучшить фактическую запись в БД, но похоже, что Монго так же быстро, как я могу это сделать. Приветствую вас за помощь. – Jascination

4

Во-первых, он ищет базу данных, чтобы узнать, существует ли объект, затем он либо обновляет существующую запись, либо добавляет новую запись.

Вы можете позволить MongoDB сделать это для вас с помощью одной команды обновления и «upsert» (обновление/вставка) вариант набора:

http://docs.mongodb.org/manual/reference/method/db.collection.update/#db.collection.update

Попробуйте это первый и посмотреть, если что-то ускорить для тебя.

+0

О, очень интересно! Я уже «обновляю», если результат существует, я не понимал, что это можно сделать сразу. – Jascination

+0

Да, это очень удобно :) Теперь, если это не улучшит производительность, вы должны взглянуть на запрос, который вы передаете манго. Убедитесь, что вы ищете индексированное поле. – martingreber

+0

Критерии, которые я проверяю, это: '{" name ": item.name, designer": item.designer, "imgs": item.imgs [0], "store": item.store} '. они используют подстановочные знаки, поэтому я предполагаю, что они все проиндексированы? – Jascination

Смежные вопросы