yopp
делаете шард, по «офису» делаете шард ключ
yopp
в офисе majority, в остальных minority
Lev
А ну и удаление-изменение - это только для конкретного офиса. Нету удаления-изменения для "глобальной" бд. Только create
yopp
тогда у вас каждый офис будет читать из реплики другого офиса, писать в мастер в тот офис, в который надо
Anna
Запись то хоть будет?)
Да, запись будет
yopp
и если линк между офисами отъехал, то писать в чужой не получится, зато можно будет читать локальную копию
yopp
и в локальный «офис» писать
Lev
@dd_bb У меня нету конфликтов при записи... Для важных данных только create read. И бесконечно растущие коллекции (ну, наверно их как то можно будет "отрезать")
yopp
https://docs.mongodb.com/manual/tutorial/sharding-high-availability-writes/
Lev
Так а как они без инета буду работать?
Lev
Так они хотят работать а не ждать инета)
yopp
берёте 4.2 и в случае если нет линка, делаете retry со временным шард ключом
yopp
в локальный шард
yopp
а потом по желанию, можно оставить как есть, можно менять ключ на нужный офис
Lev
А это не псевдо мастер-мастер?
yopp
нет
yopp
нормальный master-master это CRDT
yopp
всё остальное это профанация
Lev
Что такое CRTD? гуглится ужасно
yopp
это вам не нужно
yopp
то conflict-free replicated types
yopp
будущее, которое пока ещё не наступило
yopp
это ОЧЕНЬ дорогой по ресурсам и размеру хранилища способ сделать децентрализованное хранилище
yopp
с кучей побочных эффектов
yopp
в cockroach помоему пытались репликацию на crdt сделать
Lev
... я безусловно не гуру в базах данных. Но я в упор не понимаю, в чем проблема мастер-мастер базы когда в нее только добавляют записи с гуидником... Что там конфликтовать то может?
yopp
в том что у вас частный случай
yopp
плюс не вижу смысла менять хранилище на другое, если вашу проблему можно решить средствами существующего хранилища
Lev
Дык... тот же eventsourcing явно использует такую же модель.
yopp
я не знаю что вы имете ввиду под «eventsoursing явно использует такую же модель» но если мы говорим про m-m репликацию, то обычно говорят о полноценном хранилище, а не append-only
yopp
распределенный append-only можно сделать на чём угодно :) в том числе на монге
yopp
пишите всегда в локальный шард и всё
yopp
ну будет у вас broadcast для мержа, ну не страшно (обычно)
Lev
А как бы ... взять и залить часть монги на клиента как н Couch?
Lev
Меня прям.. заинтересовала эта фича. Просто клиенты декларативные, очень удобно.
yopp
я про couch ничего не знаю
yopp
но перед тем как вписываться в новое хранилище, убедитесь что бизнес будет спонсировать ваши усилия
Lev
?
yopp
я бы не дал денег :)
Lev
Ну так... техчасть то я выбираю
yopp
смена хранилища это очень дорого
yopp
не вижу смысла тащить блестяшее, только потому что оно белстит
yopp
особенно если с блестящим нет эксплутационного опыта
Lev
Да и с монгой опыта нет. Я ж обосновал: репликация на фронт.
yopp
что такое «репликация на фронт»?
Lev
Сейчас монга. Ну... оно работат, но я то с ней ничего не делаю. в 99% случаем обращение по id. Ну поиск простейший иногда. А ну еще change streams. Ну вот Couch бы убрал эту системную писанину. У CouchDB (как и у Couchbase вроде) есть возможность репликации в браузер. В js. PouchDB. Вы что то записали в базу на бекенде - оно реплицировалось "само" на фронт. Фронт отреагировал и перерисовался. А сейчас я это обновление ручками таскаю, сам высчитываю.
yopp
logux/redux + mongodb
Oleg
всем привет
Vova
@dd_bb
Anonymous
postinstall в npm всегда будет запущен после npm install ? Хочу отправить данные в БД один раз при установке приложения.
Anonymous
Да, всегда.
Anonymous
Как победить duplicate key error index? Там вправду есть дупликаты, нужно отправить все объекты в БД.
Anonymous
ordered: false
Вставилось 58 вместо 19, спасибо. Как вставить остальные? MongoError: E11000 duplicate key error index: test_****.subscriptions.$name_1 dup key: { : "002134e1-267c-418a-9e0f-4b5ee7fc111c" }
Anonymous
Вставляется 300к объектов вида "name": "3c2435a1-99d3-4672-9940-a646aa2c1314", "timestamp": 1567296480, "price": 7900
Anonymous
Вроде, нет. Я удалил всю БД, затем в postinstall скрипте Ноды сидю данные в БД. Понял, вроде. Дупликаты оставить независимыми вхождениями.
Daniil
У вас есть уникальный индекс на поле name и вы пытаетесь вставить два документа с одинаковыми name Определитесь что вам нужно, если вставить все документы - уберите уникальный индекс, если уникальность - уберите документы с дубликатами name
Daniil
Значит он уже создан. Сделайте в монгошелл db.subscriptions.getIndexes()
Anonymous
В админке MLab 2 штуки Collection: system.indexes: { "v": 2, "key": { "_id": 1 }, "name": "_id_", "ns": "test_aisa.subscriptions" } и { "v": 2, "unique": true, "key": { "name": 1 }, "name": "name_1", "ns": "test_aisa.subscriptions", "background": true } Удалю-ка я их.
Anonymous
Похоже, помогло. Спасибо.
Daniil
Первый не надо удалять. Второй это как раз ваш уникальны индекс по полю name, который собственно и мешал вам вставлять документы с одинаковыми значениями
P
всем привет у меня вопрос про arrayfilters Мне надо добавить значение поля стуктуры в массиве (пусть будет super_type) если это поле структуры еще не существует и другое поле (type) удовлетворяет условию но вопрос в том, что у меня версия mongo 3.2 есть какой обходной маневр?
Daniil
обновить монгу?)
P
,) в проде не все так просто
Daniil
нельзя даунтайм или нельзя обновлять?
Anonymous
Как закрыть соединение с MLab после сида данных? Есть .csv файл, парсим его и шлём в БД: readStream .pipe(csvParser({ headers: ['name', 'timestamp', 'price'], mapValues: ({ header, value }) => { if (header === "price" || header === "timestamp") { return parseInt(value, 10); } else { return value; } } })) .on('data', (data) => results.push(data)) .on('end', () => { insertToDb(results.slice(0, 100)); readStream.destroy(); // mongoose.disconnect(() => console.log('all Mongoose connections are closed')); }) это на скрипте postinstall. Выкамменченная строка // mongoose.disconnect(() => console.log('all Mongoose connections are closed')); при запуске скрипта почему-то рубит соединение прежде, чем данные уйдут в БД.
P
нельзя даунтайм или нельзя обновлять?
разные люди - разные зоны ответственности
Daniil
Если это однократная операция, то действительно полный последовательный перебор с обновлением это абсолютно нормально
Daniil
Но в целом мне кажется что в данном случае объяснить бизнесу/руководству необходимость обновления монги (привести все плюсы этого) не составит большого труда. Тогда уж спустят в другую зону ответственности поручение об обновлению
Vladislav
Привет, ребята. А с оператором $avg так разве нельзя делать?
Vladislav
$addFields: { products_avg_1: { $avg: "$products_in_date_1.items.productInfo.price" } }
Vladislav
И если нельзя, то есть ли способ из "$products_in_date_1.items.productInfo.price" получить массив, который можно скормить оператору avg?
Vladislav
то есть что-то подкрутить на предыдущей стадии)