@MongoDBRussian

Страница 175 из 342
Dmitriy
15.01.2018
07:33:40
эх, точно

а я то думал почему обратно все работает

[ { _id: 5a5c583de6ef7321ac14e72b, text: 'hehth', post: { _id: 5a5c580df8420e21651f0d24, title: 'Еще одна статья', text: 'dsavsdvasdvs', __v: 0, comments: [], created: 2018-01-15T07:28:05.181Z, rating: 0 }, __v: 0, created: 2018-01-15T07:28:58.512Z } ]

а кто будет добавлять идшники в массив comments за вас?
Делаю так, но все равно массив пуст: mongoose.connect(db.url); var id = req.params.id; var post = await Post.findById(id); var comment = new Comment({ _id: new mongoose.Types.ObjectId(), text: req.body.comment, post: post._id, }); Post.findByIdAndUpdate(id, { comments: comment._id, }); comment.save( (err, comment) => { console.log(comment); res.redirect('/posts/' + post._id); });

Google
Nick
15.01.2018
07:41:36
а comments это массив, а не один элемент, соответвенно используйте методы работы с массивами

и вы уверены что findByIdAndUpdate корректно найдет ваш пост по var id = req.params.id;?

Dmitriy
15.01.2018
07:45:18
Это точно var id = req.params.id т.к. ref для комментариев уже работает

Т.е если найти комментарий, и вызвать populate('post') то в свойстве post у комментария добавляется информация о этом посте.

[ { _id: 5a5c583de6ef7321ac14e72b, text: 'hehth', post: { _id: 5a5c580df8420e21651f0d24, title: 'Еще одна статья', text: 'dsavsdvasdvs', __v: 0, comments: [], created: 2018-01-15T07:28:05.181Z, rating: 0 }, __v: 0, created: 2018-01-15T07:28:58.512Z } ]

и вы уверены что findByIdAndUpdate корректно найдет ваш пост по var id = req.params.id;?
А вот метод findByIdAndUpdate явно лишний, пока не знаю как лучше обновить ref для массива comments

Nick
15.01.2018
07:51:06
Не знаю есть ли монгусе такие фичи, но апдейтить comments придется

Dmitriy
15.01.2018
08:03:05
Новый пост создаю так: router.post('/create', (req, res, next) => { mongoose.connect(db.url); var post = new Post({ _id: new mongoose.Types.ObjectId(), title: req.body.title, text: req.body.text, comments: [], }); post.save( () => { res.redirect('/posts/' + post._id); }) });

Я добавил еще свойство comments как пустой массив

Комментарий создается так: router.post('/:id/comment', async (req, res, next) => { mongoose.connect(db.url); var id = req.params.id; var post = await Post.findById(id); var comment = new Comment({ _id: new mongoose.Types.ObjectId(), text: req.body.comment, post: post._id, }); comment.save(() => { Post.findByIdAndUpdate(id, { comments: [{comment}], }); res.redirect('/posts/' + post._id); }); });

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

Slava
15.01.2018
08:14:12
И все так будет прздник на улице драйверов, https://engineering.mongodb.com/post/considering-the-community-effects-of-introducing-an-official-golang-mongodb-driver

Dmitriy
15.01.2018
08:21:21
Я так и не понимаю почему же массив пустой приходит после добавления комментария
Пытаюсь так но снова ничего: router.post('/:id/comment', async (req, res, next) => { mongoose.connect(db.url); var id = req.params.id; var post = await Post.findById(id); var comment = new Comment({ _id: new mongoose.Types.ObjectId(), text: req.body.comment, post: post._id, }); comment.save(); Post.update({_id: id}, { $push: { comments: comment } }); res.redirect('/posts/' + post._id); });

Google
Nick
15.01.2018
08:21:54
это уже ближе к правде

Dmitriy
15.01.2018
08:22:22
Помогите плиз, почти уже готово. Я понимаю что из коментария теперь можно вытягивать ref поста, но мне надо получить КОЛЛЕЦИЮ комментариев в посте по id

Проку от того что в комменте инфа из поста не много

Nick
15.01.2018
08:23:19
добавьте _id вместо целого коммента

Dmitriy
15.01.2018
08:25:26
добавьте _id вместо целого коммента
Так тоже пусто: Post.update({_id: id}, { $push: { comments: comment._id } });

Nick
15.01.2018
08:25:41
а await случаем не пропущен?

Dmitriy
15.01.2018
08:26:07
все

корень проблемы был в другом

await Post.update({_id: id}, { $push: { comments: comment._id } });

Приогрмнеешее спасибо!

Код решения: router.post('/:id/comment', async (req, res, next) => { mongoose.connect(db.url); var id = req.params.id; var post = await Post.findById(id); var comment = new Comment({ _id: new mongoose.Types.ObjectId(), text: req.body.comment, post: post._id, }); comment.save(); await Post.findByIdAndUpdate(id, { $push: { comments: comment._id } }); res.redirect('/posts/' + post._id); });

Т.е если имеем дело с массивами то нужен оператор $push

Nick
15.01.2018
08:35:11
я в монгусе особо не шарю, но думаю нужно ознкомиться с http://mongoosejs.com/docs/api.html#types-array-js и докучи какие есть нативные средства самой монги https://docs.mongodb.com/manual/reference/operator/update-array/

Dmitriy
15.01.2018
08:38:11
Да, спасибо. Уже понял что средставми mongodb принебрегать не стоит. Лучше мне для начала получше бы разобраться с самой mongo

Iliya
15.01.2018
08:51:26
Dmitriy
15.01.2018
08:54:54
Есть еще такой вопрос. Я "вытягиваю" автора и комментарии для текущего поста: var post = await Post.findById(id).populate('user').populate({path: 'comments', populate: {path: 'user'}}).exec();

Проблема в том что в комментариях, в свйоство user прилетает [Object], а нужен полный список свойств пользователя

Google
Dmitriy
15.01.2018
10:18:06
Вот так получается: { _id: 5a5c6caf7fd30a39c92ec6ee, title: '3213131', text: '31313123', user: { _id: 5a5c6cab7fd30a39c92ec6ed, firstname: 'Dmitriy', lastname: 'Doronin', email: 'dmitriy435@gmail.com', password: '321313', __v: 0 }, __v: 0, comments: [ { _id: 5a5c6cb97fd30a39c92ec6ef, text: 'уйцуйцууй', post: 5a5c6caf7fd30a39c92ec6ee, __v: 0, created: 2018-01-15T08:56:03.701Z }, { _id: 5a5c6cdb9ccd6039fc647c19, text: 'csacasc', post: 5a5c6caf7fd30a39c92ec6ee, user: [Object], __v: 0, created: 2018-01-15T08:56:56.119Z }, { _id: 5a5c6cfa4229273a46e66800, text: 'efwfewwfe', post: 5a5c6caf7fd30a39c92ec6ee, user: [Object], __v: 0, created: 2018-01-15T08:57:27.719Z } ], created: 2018-01-15T08:56:03.689Z, rating: 0 }

Т.е. я делаю популяцию для свойств user, comments + глубокую популяцию в comments - path: 'comments', populate: {path: 'user'}

там тоже есть свойство user

В шаблоне отображается как строка, т.к. при итерации comment in post.comments - comment.user обычная строка

IGOR
15.01.2018
12:05:21
Всем привет, продолжаю викторину тупых вопросов. Вот монго использует вместо привычных ID (1,2,3) строковые да. А у нее не случается такого при каких то обстоятельствах что она может обновить ID ? или он уникальный до самой смерти и его можно смело использовать на случай размещения ссылок на объект?

Nick
15.01.2018
12:07:35
_id нельзя изменить

Rustam
15.01.2018
12:10:39
Что подразумевается под ссылкой на объект?

XENONIUM
15.01.2018
12:14:24
Чтобы добавить поле у всех докементов... Правильно ли я делаю? Раньше работало, сейчас не работает: users.update({},{'$set': {'tokens': 0}}) Python

добавляет почему-то только у первого

IGOR
15.01.2018
12:15:47
Что подразумевается под ссылкой на объект?
Ну допустим я не особо умный и коллекция с юзерами разрастается, и хранить абсолютно все данные теперь по юзерам в коллекции Посты не вариант. Я бы хотел хранить там допустим Ник и _id на случай если мне захочется вычислить его по IP хранящийся в Коллекции Юзер. Вот я и думаю, монго же не должна так подло поступать, произвольно меня _id

IGOR
15.01.2018
12:17:39
Что?
db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

XENONIUM
15.01.2018
12:18:01
Понял, благодарю

IGOR
15.01.2018
12:18:46
Ссылаться по id - норм. Может больше подходит реляционная бд. Про ip не понял.
ip это шутка. Вопрос только по _id. Шутник из меня как кодер)

XENONIUM
15.01.2018
12:20:50
Что-то он мне ошибку выбивает: TypeError: upsert must be True or False Код: users.update({},{'$set': {'tokens': 0}},{'multi':True})

Nick
15.01.2018
12:22:21
{"multi" : true,"upsert" : false}

XENONIUM
15.01.2018
12:23:18
То же самое

Там как-то проще оно было... Но сейчас что-то не работает

Google
IGOR
15.01.2018
12:26:05
Там как-то проще оно было... Но сейчас что-то не работает
Неможет быть проще, чем сетом обновить все пол яс мультиком и апсетом. Проще только отдать другому чтобы он написал. Скопируй свой код, вставь в гугл, я думаю на мультик с апсетом выведет тебя уже на второй или третьей строчке, а там глядишь и стак оверфлоу рядышком. Я бы сейчас замарочился со всей силы, но блин пол часа осталось, а *опа в мыле

XENONIUM
15.01.2018
12:26:50
Вот стаки молчат. Сейчас вот так мульти записал, но всё равно апдейт только на первый документ

Ладно, пойду шариться

Nick
15.01.2018
12:28:04
проще только https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

XENONIUM
15.01.2018
12:31:40
Mishell
15.01.2018
12:46:38
Я что-то никак вникнуть не могу в документацию. Тут выше сказали, что после find нужно не забывать exec. Верно ли я понял, после любого метода нужно один раз дописать .exec(), а потом можно штатно спамить .then() ?

Sergey
15.01.2018
18:42:20
** IMPORTANT: UPGRADE PROBLEM: The data files need to be fully upgraded to version 3.4 before attempting an upgrade to 3.6; see http://dochub.mongodb.org/core/3.6-upgrade-fcv for more details.

блин, круто, с 3.2 на 3.6 не обновиться?

Александр
15.01.2018
18:46:21
обновись до 3.4, потом на 3.6

Sergey
15.01.2018
18:47:45
Хреново. Это-то конечно dev-машина, но накатить на неё сейчас 3.4 не тривиально

Александр
15.01.2018
18:48:22
тут без вариантов) Хотя, если на дев можно похерить базы, то можно и на 3.6 сразу)

пишут ведь что data файлы должны быть полностью обновленны, так что можно и так)

на крайний случай - можно сделать резервные копии

Sergey
15.01.2018
18:52:26
уже собираю 3.4.9 )

Александр
15.01.2018
18:59:38
)))

Алексей
15.01.2018
19:36:21
Здравствуйте, кто-нибудь может подсказать как правильно проектировать базу данных

Dmitriy
15.01.2018
19:58:05
Здравствуйте, кто-нибудь может подсказать как правильно проектировать базу данных
Можно юзать mongoose.Schema. Задаешь модель, и прописываешь типы в модели, ну и поля соответственно задаешь какие-тебе необходимы

Алексей
15.01.2018
19:58:44
А связи как?

Dmitriy
15.01.2018
20:02:08
А связи как?
Через ref. Ох, я сам совсем недавно разобрался только ) Вот ссылка про описание связей - http://mongoosejs.com/docs/populate.html

Google
Dmitriy
15.01.2018
20:04:25
Вот мой рабочий пример

Post: var postSchema = Schema({ _id: Schema.Types.ObjectId, user: { type: Schema.Types.ObjectId, ref: 'User' }, title: String, text: String, rating: { type: Number, default: 0 }, created: { type: Date, default: new Date(), }, comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }] });

Comment: var commentSchema = Schema({ _id: Schema.Types.ObjectId, post: { type: Schema.Types.ObjectId, ref: 'Post' }, user: { type: Schema.Types.ObjectId, ref: 'User' }, text: String, created: { type: Date, default: new Date(), }, });

Прописывай тип ObjectId и ссылку на другую модель в ref: какая-то модель

Но ОЧЕНО важно правильно заполнять твои данные

Иначе связи не будут работать.

Вообщем почитывай немного. А если хочешь "пощупать", вот мой пример приложения по этим связям. https://github.com/doroninds/Express-News-Blog

Обрати особое внимание в роутах, где сохраняются данные

Я сегодня чуть волосы свои не вырвал пока не понял как правильно заполнять

Алексей
15.01.2018
20:13:15
Хорошо, спасибо)

XENONIUM
15.01.2018
20:26:05
А как список в MongoDB загрузить?

У меня всё не хочет хэшить

TypeError: unhashable type: 'list'

groups.update_one({'id':chatid},{'$set':{'admins':{list}}})

Sergey
15.01.2018
20:27:42
groups.update_one({'id':chatid},{'$set':{'admins':{list}}})
groups.update_one({'id':chatid},{'$set':{'admins':[]}})

XENONIUM
15.01.2018
20:28:16
Ой, точняк

Спасибо

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