yopp
да, в дату
Yar
В транзакции можно имя указать и сделать следом вторую транзацию, не применяя первой?
Anonymous
Кто нибудь может помочь с 'mongocxx"
AstraSerg
Мб проще тогда для всех записей конвертнуть дату в строку/число (timestamp)?
Добрый день. Можно конечно в timestamp сконверить, но имхо лучше (как минимум нагляднее) сконвертить в нативный для могни формат ISODate. Выглядит это так: "last_date" : ISODate("2018-02-13T10:25:18.232Z"). Преимущество такого формата, если пользуете питон, можно сравнивать/вставлять прямо питоновскй datetime объект
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
antofa
В доках они скорее всего в таком формате и лежат
antofa
Я вызываю код из JS
AstraSerg
antofa
Забавно, наткнулся в проекте на код:
date_created: {
$lte: { $date: "2019-01-01T07:00:00.000Z" }
}
Но про $date в доках монго ничего нет..
antofa
Скрытое преобразование
Anonymous
AstraSerg
Anonymous
Anonymous
Подскажите как можно реализовать импорт всех файлов (txt) из папок и подпапок какой-либо папки максимально быстро? с мидлвейром на изменение строк
импорт = findOneAndUpdate с апсертом
Vl
Всем хай. Есть вопросец.
Vl
Допустим мне надо создать динамически поле во время выборки. К примеру я выбираю список диалогов, но мне надо еще для каждого получить последнее сообщение в этом диалоге, юзая его ид. Как такое в mongodb провернуть можно?
AstraSerg
Vl
пример. У меня есть коллекция "dialogs" в нех хранится ид отправителя и ид получателя, время создания, когда юзер отправляет сообщение, они идут в коллекцию messages с полем dialog_id
т.е. мы связываем их. Вопрос вот в чем, когда пользователь запрашивает через API список диалогов, мне надо добавить туда поле last_message к диалогу, оно должно выбираться динамически, брать последнее сообщение, которое привязано к этому диалогу ид коллекции messages
Vl
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
AstraSerg
Последнее можно взять на следующем шаге пайплайна
Vl
Vl
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
Vl
Vl
почему-то оно игнорирует оператор $nin в которому указано какие сообщения удалены и выбирает самое последнее сообщение, которое для одного из собеседников может быть удалено
AstraSerg
а removedMessages и ignoredDialogs - это что?
AstraSerg
для nin требуется список (list) https://docs.mongodb.com/manual/reference/operator/query/nin/
Vl
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
Есть еще грязный способ, остановить базу в спокойном режиме, если такая возможность есть.
Скопировать или перенести файлы базы, запустить на новом инстансе, но нужно понимать, что между разными системами и версиями монги такой трюк не сработает.
Anonymous
Denis
А инстанс выключен или нет?
Инстанс с которого будет происходить копирование будет включен. Сейчас почитаю про этот инструмент. попробуем его .Спасибо. Грязный способ что то не охото делать
Constantin
насколько я знаю mongodump по-умолчанию роли и юзеров не собирает, нужно использовать флаг, который я скинул выше
Constantin
Ну вполне может быть, я просто снимаю обычно с конкретной БД
Anonymous
Вообще не понял, что вы хотите сделать
в папке и ее подпапках - текстовые файлы.
На каждую строку файла нужно делать запись в бд. Так из всех файлов все данные должны перенестись в бд
Мне инетересно как это можно сделать максимально быстро
Denis
Constantin
Anonymous
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!');
});
Нужно только добавить рекурсивное чтение поддиректорий
Constantin
Sergey K
Кто-нибудь использовал mongodb вместе с Django?