@MongoDBRussian

Страница 277 из 342
Constantin
30.07.2018
15:50:51
Есть еще грязный способ, остановить базу в спокойном режиме, если такая возможность есть. Скопировать или перенести файлы базы, запустить на новом инстансе, но нужно понимать, что между разными системами и версиями монги такой трюк не сработает.

Banschikov
30.07.2018
15:56:59
А инстанс выключен или нет?
Инстанс с которого будет происходить копирование будет включен. Сейчас почитаю про этот инструмент. попробуем его .Спасибо. Грязный способ что то не охото делать

Вообще mongodump и mongorestore вам нужны, монгодамп умеет дампить и пользователей и роли, если его попросить
Сейчас почитал и вроде как понял что по умолчанию эта утилита дампить с БД, пользователей и роли. Правильно понял?

Google
Constantin
30.07.2018
16:06:59
насколько я знаю mongodump по-умолчанию роли и юзеров не собирает, нужно использовать флаг, который я скинул выше

никто не сталкивался?
Вообще не понял, что вы хотите сделать

Banschikov
30.07.2018
16:09:12
насколько я знаю 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
30.07.2018
16:09:50
Ну вполне может быть, я просто снимаю обычно с конкретной БД

Phoenix»
30.07.2018
16:10:32
Вообще не понял, что вы хотите сделать
в папке и ее подпапках - текстовые файлы. На каждую строку файла нужно делать запись в бд. Так из всех файлов все данные должны перенестись в бд Мне инетересно как это можно сделать максимально быстро

Constantin
30.07.2018
16:14:02
в папке и ее подпапках - текстовые файлы. На каждую строку файла нужно делать запись в бд. Так из всех файлов все данные должны перенестись в бд Мне инетересно как это можно сделать максимально быстро
Через 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
30.07.2018
16:35:40
спасибо, но наверное это немного не то сейчас построчное чтение, да и нужно через монгус
Если порядок создаваемых документов не важен, что-то такое: 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
30.07.2018
20:48:33
Кто-нибудь использовал mongodb вместе с Django?

Irina
30.07.2018
21:07:05
Привет. Помогите, пожалуйста, с агрегацией. Есть примерно вот такая коллекция, мне нужно получить имя пользователя и только ту часть массива battles, которая соотвествует условию date: { $gte: sundayBattle} [{ t_name:"Username", battles: [ {exp:20, date:2018-07-26 01:00:00.000 }, {exp:20, date:2018-07-27 15:00:00.000 } ] }, {}]

Google
Bro
30.07.2018
21:39:04
а где там аггрегация

Irina
30.07.2018
21:39:50
а где там аггрегация
через find есть только $elemMatch, который вернет только первое совпадение

Bro
30.07.2018
21:40:17
да

только хотел написать

$elemMatch юзай

в аггрегации тоже можно

ну так сделай $unwind

$unwind потом отсекаешь что по суловиям не катит потом груп

$unwind -> $match -> $group (по юзеру)

Irina
30.07.2018
21:52:03
$unwind -> $match -> $group (по юзеру)
так?) Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$match:{battles:{$elemMatch: { date: { $gte: sunday}}}}}, {$group:{user:'$cw_name', battles:'$battles'}} ])

Bro
30.07.2018
21:53:57
не

$elemMatch тебе не нужен

Irina
30.07.2018
21:54:51
сложновато

$elemMatch юзай

$elemMatch тебе не нужен

Bro
30.07.2018
21:55:07
ну если ты анвинд сделал то не нужен

элем матч просто по массиву итерируется

а ты его развернул

Irina
30.07.2018
21:56:04
так оставить battles.date: { $gte: sunday}?

Google
Bro
30.07.2018
21:56:39
т.е. просто тупо $match: {$gte: sundayBattle}

да

шаришь

ну и потом груп делай и проекцию и собирай как надо

Irina
30.07.2018
21:57:34
так вроде понятней, спасибо

Bro
30.07.2018
22:00:13
пожалуйста. в начале немного не въехал что там нужно было.

Irina
30.07.2018
22:00:42
Bro
30.07.2018
22:02:32
"battles.date": {"$gte": ....} вроде так

$match: {"battles.date": {"$gte": ....}}

только без кавычек если в консоли монго или js

Irina
30.07.2018
22:05:25
ну и с $group в этой ситуации не очень ясно {$group:{user:'$cw_name', battles:'$battles'}} - так нельзя написать

в общем реально проще просто все отфильтровать уже на сервере

Bro
30.07.2018
22:08:53
эм?

ну канешно нельзя

группируешь ты по чему-то

что является ключем

$group: {_id: "$t_name", ....}

а баттлз засовываешь в список

типа будет что-то вроде $group: {_id: "$t_name", sunday_battles: {$push: "$battles"}}

ну и получается ключ один а для этого ключа (юзера) баттлов много и их нужно засунуть в какой-то контейнер (array)

Google
Bro
30.07.2018
22:13:19
т.е. $push или $addToSet

а баттлы уже отфильтрованы по дате

на предыдущем стэйдже пайплайна

Irina
30.07.2018
22:14:38
вернулся пустой массив в итоге

я сдаюсь

Bro
30.07.2018
22:15:08
ну сразу никогда не получается

нужно попробовать то се

мне не видно че там у тебя поэтому сложно советы давать

Irina
30.07.2018
22:16:03
юзеров если что много

Bro
30.07.2018
22:16:15
посмотри на этапе $match все верно? а потом след стэйдж пайплайна смотри

ну понятно что много у тебя в итоге будет список юзерв с баттлами для каждого

Irina
30.07.2018
22:20:17
Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$match:{'battles.date': { $gte: sundayBattle}}}, {$group:{_id:'$t_name', week_battles:{$push:'$battles'}}} ])

в итоге так код выглядит

Bro
30.07.2018
22:20:50
ну что-то вроде

работает?

Irina
30.07.2018
22:20:56
неа

Bro
30.07.2018
22:21:36
ну убирай потихоньку этапы пайплайна

$match:{squad: msg.chat.title}} - возвращает результаты?

msg.chat.title - вместо этого попробуй просто название. это я так понимаю сразу в коде где-то

Google
Bro
30.07.2018
22:23:12
$unwind разворачивает как надо?

что после анвинда получается?

Irina
30.07.2018
22:25:35
фигня какая-то получается как будто всю схему вообще выводит

Юзеры дублируются много раз

Bro
30.07.2018
22:27:39
ну он разворачивает т.е. у тебя было {_id: 1, lst: [1, 2, 3]} а если сделать $unwind: "$lst" будет {_id: 1, lst: 1}, {_id: 1, lst: 2}, {_id: 1, lst: 3}

battles разворачивается потом ты его фильтруешь

{$match:{'battles.date': { $gte: sundayBattle}}},

это работает?

Irina
30.07.2018
22:29:01
ага

на этом этапе пустой массив приходит

Bro
30.07.2018
22:31:04
Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$group:{_id:'$t_name', count:{$sum:1}}} ])

попробуй такое будет работать

может у тебя просто нет записей которые условию удовлетворяют

Irina
30.07.2018
22:31:39
записи точно есть попробую

MongoError: unknown group operator '$inc'

Страница 277 из 342