Как посчитать схему mongodb, отличную от родительской схемы?

#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 параметр.