#javascript #node.js #mongodb
#javascript #node.js #mongodb
Вопрос:
на данный момент у меня небольшая проблема. У меня есть схема, в которой хранятся мои сообщения в блоге. В другой схеме я сохраняю комментарии. В этой схеме я сохраняю parent.id из записи в блоге.
Теперь я хочу посчитать комментарии, отобразите это количество под сообщением в блоге. (Информация: я использую express, edge. Все думает, что работает очень хорошо!)
Мой модуль выглядит так:
const Post = require('../database/models/Post');
const Comment = require('../database/models/Comment');
module.exports = async(req, res) => {
const posts = await Post.find({}).sort({ _id: -1 });
const estimate = await Post.count({}); //all post blogs
const comments = await Comment.count({}); //all comments
// here I want to count all comments from one post blog ... etc ...
res.render("index", {
posts, estimate, comments
});
}
Вот схемы:
const mongoose = require('mongoose');
const PostSchema = new mongoose.Schema({
title: String,
description: String,
content: String,
username: String,
createdAt: {
type: Date,
default: new Date()
}
});
const Post = mongoose.model('Post', PostSchema);
module.exports = Post;
--------
const mongoose = require('mongoose');
const CommentSchema = new mongoose.Schema({
comment: {
type: String,
//required: true
},
username: {
type: String,
},
parent_id: { // <-- the _id from posts
type: String
}
});
var Comment = mongoose.model('Comment', CommentSchema);
module.exports = Comment;
Надеюсь, кто-нибудь может дать мне подсказку.
Спасибо
———————-8<————8<——————- РЕДАКТИРОВАТЬ:
Мой index.edge:
@each(post in posts)
<!-- some code here -->
{{ post._id }} <-- current post id
@if(post._id == allPostCommentCounts._id)
have comments
@else
no comments
@endif
tried:
@if(allPostCommentCounts.count > 0)
have posts {{ allPostCommentCounts.count }}
@endif
@endeach
Операторы if не работают.
Консоль.журнал выглядит следующим образом из allPostCommentCounts и posts:
[
{ _id: '5f96c97a8cad2c5250597b0b', count: 2 },
{ _id: '5f9ee8fcfc7fb52de8c9ab50', count: 3 }
]
[
{
createdAt: 2020-11-01T16:55:49.139Z,
_id: 5f9ee8fcfc7fb52de8c9ab50,
username: 'f',
title: 'f',
description: '',
content: 'fff',
__v: 0
},
...
}
]
мммм… Я не знаю, что не так.
Комментарии:
1. res.render(«index», { сообщения, оценка, комментарии, allPostCommentCount });
Ответ №1:
Я не уверен, нужно ли вам количество комментариев для определенного сообщения или для всего сообщения, поэтому давайте рассмотрим каждый случай.
Количество комментариев в одном сообщении
Это можно сделать, просто добавив запрос внутри функции count, указав идентификатор блога.
const commentCount = await Post.count({ parent_id: blog_id });
Количество комментариев для всех сообщений
Эта схема немного сложнее. Вам нужно будет использовать агрегации Mongo (подробнее о них можно прочитать здесь). По сути, вы хотите сгруппировать свои Comments
по parent_id
и посчитать их, так что вот как это должно выглядеть:
const allPostCommentCount = await Comment.aggregate({
$group: {
_id: "$parent_id",
count: {
$sum: 1,
},
},
});
Комментарии:
1. второй — это то, что мне нужно. Но как я могу получить эти результаты в моей платформе edge, чтобы распределить количество под каждым основным сообщением в блоге?
2. У меня нет опыта работы с Edge, но в основном результатом является массив с каждым объектом, имеющим этот формат:
{ _id: 24, count: 1 }
так что в основном, когда вы просматриваете свои сообщения в блоге, вам просто нужно найти запись в списке количества комментариев, которая соответствует определенному идентификатору, и отобразитьcount
параметр.