forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JavaScript / HTML (http://forum.boolean.name/forumdisplay.php?f=136)
-   -   Node.JS + MongoDB (http://forum.boolean.name/showthread.php?t=18507)

moka 01.10.2013 13:53

Ответ: Node.JS + MongoDB
 
Учти что поиск по тексту как у тебя не будет использовать никакой индексации, и на больших таблицах может быть очень дорогим, тем более что ты не ограничиваешь число результатов.

Для регулярок, тебе нужно использовать `new RegExp()`. А чтобы использовать индексацию по полю, то можешь сделать так:
PHP код:

new RegExp('^' query

Что говорит "начинается с". Естественно это зависит от капитализации символов, поэтому ты может захочешь хранить копию текста с toLowerCase() заранее. Индексация как понимаю будет tree с нодами по алфавиту, что очень продуктивно, тебе не нужно париться как индекс работает и т.п., главное создай индекс по полю. Да и советую убедиться что в регулярке нету ничего "опасного", т.к. сделать её очень тяжолой - весьма просто, следственно и загрузить твою БД, сложной регуляркой не составит труда.

pax 01.10.2013 14:25

Ответ: Node.JS + MongoDB
 
Мне с индексами не судьба, хочу имена кланов сделать с именами типа -=М.О.Й.К.Л.А.Н=-

moka 01.10.2013 14:40

Ответ: Node.JS + MongoDB
 
И что мешает это всё равно заиндексировать?
Можно сделать массив `search` который будет содержать 2 вида строк: в нижнем регистре и в нижнем регистре без знаков.
Далее простой индекс по этому полю `search`, и затем поиск будет весьма продуктивен.
Главное это escape'ить регулярные знаки в прописные, например . в \. и т.п.
Далее поиск будет работать по таким запросам:
Код:

-=м.О.Й.к.л
мой
МоЙКЛаН
мо
-=м.

Что для поиска думаю вполне достаточно и гравное это будет очень быстрым поиском.

pax 03.10.2013 14:33

Ответ: Node.JS + MongoDB
 
Ближайший вопрос, который хотелось бы решить - это резервное копирование базы. Как это правильно сделать?

moka 03.10.2013 18:41

Ответ: Node.JS + MongoDB
 
Backup?

Есть трои принятых способа бэкапить бд, первый будет используя mongoexport/mongoimport второй mongodump/mongorestore, и снапшот системы (это для облаков).

mongoexport/mongoimport
Оперирует JSON данными, и предусмотрен к бэкапу только данных и не содержит никаких мета данных. Также т.к. данные в JSON формате, а он ненмого будет побольше чем BSON, нужно больше места для его хранения.
Плюс при импорте, подразумевается что у тебя уже есть сама база данных с коллекциями и всеми индексами.
Думаю это удобно для быстрого копирования блока данных между базами, но не совсем для бэкапов.

mongodump/mongorestore
Этот способ реально хорошо справляется с бэкапами, делает полную копию данных самих коллекций и всей базы (если на всю делаешь), хранит данные в BSON (что оптимальнее), а также хранит мета данные о коллекциях, индексах и других плюшках для полной копии восстановления.

Snapshot of System
Этот подход используется в облаках, когда ты можешь создать полную копию текущей системы. Такие снапшоты обычно весьма весомы, т.к. бэкапят всё что есть на системе а не только бд. Если у тебя большая бд и много ресурсов на системе - тебе такой вариант не подойдёт.


Я использую mongodump/mongorestore, с ним можно дампить как всю бд, так и отдельные базы данных, так и более детально - отдельные коллекции.
Учти что при mongorestore, если есть уже бд и коллекция - то данные добавяться паралельно к прошлым, так что если ресторишь, то удаляй коллекцию или всю бд (если всю бд ресторишь).

Я написал скрипт который запускается каждый день в 3 ночи, используя node.js, он используя child_process вызывает command line для mongodump, который в свою очередь создаёт папку. Далее я это дело tar'ю, и заливаю там же скриптом на S3 Bucket, где стоит правило - автономно удалять файлы старее 1го месяца.

Всё автономно, и никакой парки, плюс бэкапяться у меня две базы данных за один подход как два разные tar'а.

pax 04.10.2013 17:00

Ответ: Node.JS + MongoDB
 
Все еще не очень понимаю вот это: http://nodejs.org/api/buffer.html
Цитата:

'binary' - A way of encoding raw binary data into strings by using only the first 8 bits of each character. This encoding method is deprecated and should be avoided in favor of Buffer objects where possible. This encoding will be removed in future versions of Node.
Как правильно с бинарными данными работать в node js?

moka 04.10.2013 18:34

Ответ: Node.JS + MongoDB
 
Что конкретно тебе нужно с бинарными данными?

pax 04.10.2013 22:23

Ответ: Node.JS + MongoDB
 
Хочу научиться работать с бинарными данными как с MemoryStream в C#. Хочу свой протокол сериализации реализовать в будущем для клиентсервера.

moka 04.10.2013 22:29

Ответ: Node.JS + MongoDB
 
Ну ты как бы можешь да юзать то что тут есть, но для работы с бинарными данными я очень рекомендую поступить одним из способов:

1. Писать Addon на С++ для парсинга бинарных данных в JSON объект.
2. Заюзать готовые решения для этого, например protobuf.
3. Взять готовое решение на С++, и написать враппер/addon для него, например Cap'n Proto отличный выбор будет.

Для начала и JSON'а хватает с головой. Если качественно написать логику сбора данных, то заменить сборку и разборку данных сможешь потом без проблем.

pax 10.10.2013 10:05

Ответ: Node.JS + MongoDB
 
Больше всего в ноде не нравится то, что приходится делать вот такие "елки":



Особенно в те моменты когда есть асинхронные ветвления (иногда необходимо сделать лишний запрос в базу, а иногда нет). Я тогда справляюсь с использованием функций, которые вызываю несколько раз в ветвлении.

К примеру (функция addRequest):

moka 10.10.2013 13:47

Ответ: Node.JS + MongoDB
 
Угу, эта проблема популярна. Один из хороших вариантов "решения" её будут promise. Можно chain'ить асинхронные запросы как угодно, и отлавливать ошибки лучше.
И на err ты не проверяешь нигде :)..

pax 10.10.2013 13:59

Ответ: Node.JS + MongoDB
 
Цитата:

Сообщение от moka (Сообщение 268581)
И на err ты не проверяешь нигде :)..

Мне проще проверить результат на наличие)

moka 10.10.2013 14:03

Ответ: Node.JS + MongoDB
 
Цитата:

Сообщение от pax (Сообщение 268582)
Мне проще проверить результат на наличие)

Результата может не быть, и ошибки может не быть, например просто не найден.
А ошибка указывает на ошибку в запросе, что порой ведёт к неприятным последствиям. Суть ловли ошибок, приводит к отслеживанию где запросы были не хорошие, и заставляет разраба валидить данные в запрос лучше.

Например если ты где-то забыл убрать "неприятные" символы в стринге, что приводит к регулярке, а это очень неприятно для бд.. Или объект для фильтров собрал нехороший :) А порой претендуешь что есть переменная в документе, а её нету, тоже бывает такие дела..

pax 10.10.2013 14:37

Ответ: Node.JS + MongoDB
 
ну наличие переменных в документе я проверяю там где надо, да и обработки ошибок я когда-нибудь впишу, когда появится на это время)

moka 10.10.2013 15:04

Ответ: Node.JS + MongoDB
 
Вот поковырялся, я писал для себя сам мелкие функции для chain'ов асинхронных функций, но можешь заюзать async https://github.com/caolan/async там етсь например series - запускает функции поочереди. Думаю там можно также вставлять по пути до функции (task injection), и т.п.


Часовой пояс GMT +4, время: 22:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot