Мультизапрос / Мультисортировка (?) С понедельником goose дюйм Node.js - PullRequest
0 голосов
/ 27 мая 2020

Я работал над новостным сайтом, где пользователи могут публиковать статьи и оставлять комментарии. Часть комментариев предназначена для обозначения эмоции к комментарию (один из 5 вариантов: удивленный, счастливый, нейтральный, грустный, сердитый).

Я хочу сделать с этим комментарием «пятерку лучших» статьи с наибольшим количеством эмоций учитываются для определенной c эмоции. И, конечно же, я знаю, что на форуме эмоции всегда «злые», поэтому я должен просто поработать с этим; D, но это часть опыта обучения, и я хотел бы знать, как это сделать.

Итак, для других топ-5 («горячие обсуждения» и «горячие новости») я ввел счетчики в моей схеме статьи, которые увеличиваются либо при добавлении комментария (для «hotDiscussion»), либо когда пользователь указывает что-то как «истинное». горячие новости »(« функция кнопки лайк »). Затем я просто ищу статьи и сортирую по этим счетчикам ...

НО, для этого конкретного c случая, где есть 5 вариантов, как мне отсортировать?!? ... сначала я подумал, что просто добавлю счетчики, когда выбрана определенная эмоция (выпадающее меню). Но тогда все счетчики находятся «в статье» как единое целое, и я не понимаю, как вы можете отсортировать их по всем, чтобы получить исчерпывающий список. Итак, я решил поместить их в объект или массив ... что-то вроде:

Article {
   title: String,
   author: user...
   comments: []
   emotions: [ or {
        Amazed: amazedCount,
        Happy: happyCount,
        Neutral: neutralCount,
        Sad: sadCount,
        Angry: angryCount
   } or ]

Тогда, может быть, я смогу найти все статьи и отсортировать их по эмоциям (каким-то образом?), А затем просмотреть верхнюю часть 5 из списка. Но здесь я снова сталкиваюсь с 5 вариантами. И я понятия не имею, как сортировать эмоции? чтобы затем, возможно, в результатах отсортировать по первому (самому высокому) счету. Чтобы затем просмотреть верхнюю часть 5.

Итак, осмотр здесь несколько намекает на то, что я ищу что-то вроде этого

Article {
   ...
   ...
   emotions: [ 
       {name: Amazed, value: amazedCount},
       {name: Happy, value: happyCount},
       {name: Neutral, value: neutralCount},
       {name: Sad, value: sadCount},
       {name: Angry, value: angryCount}
     ]

И мне немного нравится это направление из-за кнопок Clear «имя» и «значение». Но здесь я сталкиваюсь с той же проблемой, иначе. недостаток знаний ... Потому что:

  • как отсортировать по значению второго порядка, как я буду сортировать по значению?
  • будет ли одна и та же статья отображаться несколько раз в результат? (я бы хотел предотвратить это, если это вообще возможно, очень загруженная ветка смешанных эмоций не должна появляться дважды по сравнению с менее загруженной, но явно «счастливой» веткой в ​​топ-5).

Надеюсь, кто-нибудь может мне помочь, так как я вижу этот тип поиска ценным в различных ситуациях, а не только для некоторой учебной среды типа «форум» top5.


Для тех, кому нужен более полезный вариант использования '

warehouse{
   name: String,
   ... : ...
   parts: [
        {name: part1, value: Count}
        {name: part2, value: Count}
        {etc }
         ]
    }

Формирование списка складов на основе количества деталей (где двойное упоминание определенного склада не проблема); Или скажите список автосалонов с наибольшим количеством доступных марок или моделей (чтобы получить данные для распространения f / e). Или список интернет-магазинов с многозначной рейтинговой системой (f / e: скорость доставки, обслуживание клиентов, цена товаров и т. Д. c.)

1 Ответ

0 голосов
/ 29 мая 2020

Ну, оказывается, это на самом деле довольно просто ... поскольку я был там почти всегда. Просто нужно поставить критерии сортировки между '...' / doh!

! ЭТОТ КОД НЕ ЗАВЕРШЕН , как в Copy / Paste, все готово , но приведенный ниже код действительно показывает вам большинство мест, где вам нужно что-то «делать», чтобы эта работа работала (/ показать маршруты не включены, то есть страницы, которые пользователь видит и может вводить данные)

    // In the Schemas:
        Article {
           ...
           ...
           emotions: [ {emotion: String, eCount: Number} ]
        }

        Comment{
           emotion: String;  //to save the emotion of the user on the comment
         }
    
    // Upon initializing an Article:
        router.post("/route", function(req, res){
            let etcetera: etc,
            let theEmotions = [  // in your usecase you may populate these elsewhere
                            { emotion: "Amazed", eCount: 0 }, 
                            { emotion: "Happy", eCount: 0 }, 
                            { emotion: "Neutral", eCount: 0 },
                            { emotion: "Sad", eCount: 0 },
                            { emotion: "Angry", eCount: 0 }     
                        ];
        
            let newArticle = {
              etc: etc,
              emotions: theEmotions
            };
        
            Article.create(newArticle, function(err, newArticle){
               *stuff here*
            });
        });
        
    // when a comment gets made, it updates the scores based upon the emotion selected
    //REST :: CREATE --> actually creates a new comment
    router.post("/", function(req, res){
        Article.findById(req.params.id, function(err, foundArticle){
            if(err){
                console.log("ERROR @ finding article to POST the COMMENT");
                res.redirect('/articles');
            } else {
                Comment.create(req.body.comment, function(err, createdComment){
                    if(err){
                        console.log("ERROR @ CREATing new COMMENT");
                    } else {
                        switch(createdComment.emotion){
                            case "Amazed":
                                foundArticle.emotions[0].eCount += 1;
                                break;
                            case "Happy":
                                foundArticle.emotions[1].eCount += 1;
                                break;
                            case "Neutral":
                                foundArticle.emotions[2].eCount += 1;
                                break;
                            case "Sad":
                                foundArticle.emotions[3].eCount += 1;
                                break;
                            case "Angry":
                                foundArticle.emotions[4].eCount += 1;
                                break;
                            default:
                                console.log("ERROR @ Emotion Switch in comments route");
                        }
                        //add username and id to comment
                        createdComment.user.id = req.user._id;
                        createdComment.user.username = req.user.username;
                        createdComment.save();
                        foundArticle.comments.push(createdComment);
                        foundArticle.save();
                        console.log("SUCCESS @ CREATing new COMMENT");
                        res.redirect('/articles/' + foundArticle._id);
                    }       
                });
            }
        });
    });

    //Where one wants to sort: ... note the '...' around 'emotions.eCount'
    router.get("/specificRoute, function(req, res){
        Article.find({}).sort({'emotions.eCount': -1}).exec(function(err, hotEmotions){
    
            *stuff happens here*
    
        });
    });

Надеюсь, это поможет кому-то где-нибудь в будущем :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...