yopp
да, в дату
Yar
В транзакции можно имя указать и сделать следом вторую транзацию, не применяя первой?
Anonymous
Кто нибудь может помочь с 'mongocxx"
AstraSerg
Мб проще тогда для всех записей конвертнуть дату в строку/число (timestamp)?
Добрый день. Можно конечно в timestamp сконверить, но имхо лучше (как минимум нагляднее) сконвертить в нативный для могни формат ISODate. Выглядит это так: "last_date" : ISODate("2018-02-13T10:25:18.232Z"). Преимущество такого формата, если пользуете питон, можно сравнивать/вставлять прямо питоновскй datetime объект
AstraSerg
Кто нибудь может помочь с 'mongocxx"
Извините, я в крестах не специалист. Но озвучте вопрос, может поможет кто.
Constantin
А еще с Date и ISODate можно делать операции над датами в агрегировании, а timestemp — нет. Еще мало кто знает, но с ObjectId можно тоже
Anonymous
Извините, я в крестах не специалист. Но озвучте вопрос, может поможет кто.
mongocxx::instance instance{}; // This should be done only once. mongocxx::uri uri("mongodb://192.168.1.1:27017"); mongocxx::client client(uri); mongocxx::database db = client["test"]; mongocxx::collection coll = db["counters"]; mongocxx::cursor cursor = coll.find({}); for(auto doc : cursor) { std::cout << bsoncxx::to_json(doc) << "\n"; } Вот код, он рабочий, компилируется и запускатся. Но при компиляции выводит ошибку Method 'find' could not be resolved 'mongocxx::cursor' could not be resolved
Anonymous
толи не индекцируются файлы толи что то другое...
AstraSerg
> Вот код, он рабочий, компилируется и запускатся. Но при компиляции выводит ошибку то есть работает? и даёт правильный результат? разве ошибка компиляции не критична для создания запускаемого бираника в крестах? Вообще, последовательность действий выглядит нормально, если с питоном сравнивать
antofa
Что-то с датами не выходит.. http://dpaste.com/0XEQKA8 В чем тут может быть проблема? Создаю дату из строки и потом же с ней сравниваю - результат не выдает.
antofa
Решил пока через timestamp http://dpaste.com/24FAR01 . Но это такое..
AstraSerg
Что-то с датами не выходит.. http://dpaste.com/0XEQKA8 В чем тут может быть проблема? Создаю дату из строки и потом же с ней сравниваю - результат не выдает.
так вроде остановились на том, что вы преобразуете все даты во всех документах в ISODate, или я не понял чего-то?
antofa
В доках они скорее всего в таком формате и лежат
antofa
Я вызываю код из JS
AstraSerg
В доках они скорее всего в таком формате и лежат
это было бы видно когда делаете find
antofa
Забавно, наткнулся в проекте на код: date_created: { $lte: { $date: "2019-01-01T07:00:00.000Z" } } Но про $date в доках монго ничего нет..
antofa
Скрытое преобразование
AstraSerg
Anonymous
Подскажите как можно реализовать импорт всех файлов (txt) из папок и подпапок какой-либо папки максимально быстро? с мидлвейром на изменение строк импорт = findOneAndUpdate с апсертом
Vl
Всем хай. Есть вопросец.
Vl
Допустим мне надо создать динамически поле во время выборки. К примеру я выбираю список диалогов, но мне надо еще для каждого получить последнее сообщение в этом диалоге, юзая его ид. Как такое в mongodb провернуть можно?
Vl
пример. У меня есть коллекция "dialogs" в нех хранится ид отправителя и ид получателя, время создания, когда юзер отправляет сообщение, они идут в коллекцию messages с полем dialog_id т.е. мы связываем их. Вопрос вот в чем, когда пользователь запрашивает через API список диалогов, мне надо добавить туда поле last_message к диалогу, оно должно выбираться динамически, брать последнее сообщение, которое привязано к этому диалогу ид коллекции messages
Vl
На выходе должно получиться что-то такое.
Vl
Только сейчас у меня last_message поле хранится в диалоге, но так быть не должно
Vl
Ибо last_message для каждого юзера свое.
Vl
Один мог удалить, а другой нет. и тому подобное
AstraSerg
А так для этого lookup используют: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
AstraSerg
подойдёт для вашего случая?
Vl
Да, но мне бы для него еще условия ставить
Vl
Я думал юзать это
Vl
но как мне указать, что надо брать последнее?
Vl
которого нету в массиве удаленных сообщений для юзера?
Vl
А так для этого lookup используют: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
В итоге я так и не понял, как взять только последнее
AstraSerg
Последнее можно взять на следующем шаге пайплайна
AstraSerg
А можно чуток подробнее?
:) Что у вас получается после лукапа? Дайте пример
Vl
оно берет все сообщения в диалоге
AstraSerg
ага, после этого делаете unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ что бы получить множество документов с каждым из элементов массива.
AstraSerg
и потом уже выбираете нужный
Vl
Спасибо
AstraSerg
Но возможно вам подойдёт вот такой вариант: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries
AstraSerg
это новое с 3.6 и я как-то его упустил из виду
Vl
почему-то оно игнорирует оператор $nin в которому указано какие сообщения удалены и выбирает самое последнее сообщение, которое для одного из собеседников может быть удалено
AstraSerg
а removedMessages и ignoredDialogs - это что?
AstraSerg
для nin требуется список (list) https://docs.mongodb.com/manual/reference/operator/query/nin/
Vl
а removedMessages и ignoredDialogs - это что?
Массив с айдишниками
AstraSerg
Массив с айдишниками
Попробуйте соединить все 3 условия при помощи $and
Vl
Ок
Vl
Спасибо
AstraSerg
Спасибо
Но, вообще, должео и без $and работать:
AstraSerg
Denis
Иоу! Подскажите плес, к примеру когда базу переносишь с одного экземпляра монги на другой, то все внутри этой базы остается (юзеры, коллекции и т.д)?
Constantin
Эм, смотря как вы собираетесь ее переносить
Denis
Эм, смотря как вы собираетесь ее переносить
Впервые с этим сталкиваюсь, поэтому и пришел за советом. Хотелось бы перенести все базы на новый экземпляр монги и запустить это все дело. Я как понимаю можно это сделать как при помощи copydb ? https://docs.mongodb.com/manual/reference/command/copydb/
Constantin
А инстанс выключен или нет?
Constantin
Вообще mongodump и mongorestore вам нужны, монгодамп умеет дампить и пользователей и роли, если его попросить
Constantin
https://docs.mongodb.com/manual/reference/program/mongodump/#cmdoption-mongodump-dumpdbusersandroles
Constantin
Есть еще грязный способ, остановить базу в спокойном режиме, если такая возможность есть. Скопировать или перенести файлы базы, запустить на новом инстансе, но нужно понимать, что между разными системами и версиями монги такой трюк не сработает.
Denis
А инстанс выключен или нет?
Инстанс с которого будет происходить копирование будет включен. Сейчас почитаю про этот инструмент. попробуем его .Спасибо. Грязный способ что то не охото делать
Denis
Вообще mongodump и mongorestore вам нужны, монгодамп умеет дампить и пользователей и роли, если его попросить
Сейчас почитал и вроде как понял что по умолчанию эта утилита дампить с БД, пользователей и роли. Правильно понял?
Constantin
насколько я знаю mongodump по-умолчанию роли и юзеров не собирает, нужно использовать флаг, который я скинул выше
Constantin
никто не сталкивался?
Вообще не понял, что вы хотите сделать
Denis
насколько я знаю mongodump по-умолчанию роли и юзеров не собирает, нужно использовать флаг, который я скинул выше
This option applies only when you specify a database in the --db option. MongoDB always includes user and role definitions when mongodump applies to an entire instance and not just a specific database. Вот тут показалось это, но видимо неправильно изтрактовал
Constantin
Ну вполне может быть, я просто снимаю обычно с конкретной БД
Anonymous
Вообще не понял, что вы хотите сделать
в папке и ее подпапках - текстовые файлы. На каждую строку файла нужно делать запись в бд. Так из всех файлов все данные должны перенестись в бд Мне инетересно как это можно сделать максимально быстро
Constantin
в папке и ее подпапках - текстовые файлы. На каждую строку файла нужно делать запись в бд. Так из всех файлов все данные должны перенестись в бд Мне инетересно как это можно сделать максимально быстро
Через bash прочитать, сформировать команды mongo shell и скормить ему через pipe или подобным образом Если хочется через сам mongo shell то в голову приходит только cat Вот тут нашел вам пример use wordlists var file = cat('path/to/yourFile.txt'); // read the file var words = file.split('\n'); // create an array of words for (var i = 0, l = words.length; i < l; i++){ // for every word insert it in the collection db.rockyou.insert({'word': words[i]}); }
Constantin
спасибо, но наверное это немного не то сейчас построчное чтение, да и нужно через монгус
Если порядок создаваемых документов не важен, что-то такое: const mongoose = require('mongoose'); const readdir = require('fs').readdirSync; const files = readdir(PATH_TO_DIR); const promisses = []; for (const file of files) { if (file.slice(-3) !== '.txt') continue; const rows = file.split('\n'); for (const row of rows) { if (!row) continue; promisses.push( mongoose.models.ExampleClient.create({ name: row }) ); } } Promise.all(promisses). then(() => { console.info('Done!'); }); Нужно только добавить рекурсивное чтение поддиректорий
Sergey K
Кто-нибудь использовал mongodb вместе с Django?