Перебирая массив документов монго и получая счетчик для свойства вложенного массива? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть массив отелей такой формы:

[
  {
      "_id" : ObjectId("..."),
      "Reviews" : [ 
          {
              "Ratings" : {
                  "Service" : 4.0,
                  "Cleanliness" : "4",
                  "Overall" : 4.0,
                  "Value" : 4.0,
                  "Sleep Quality" : "4",
                  "Rooms" : "4",
                  "Location" : "5"
              },
              "AuthorLocation" : "...",
              "Title" : "...",
              "Author" : "...",
              "ReviewID" : "...",
              "Content" : "...",
              "Date" : ISODate("...")
          }, 
          {
              "Ratings" : {
                  "Cleanliness" : "5",
                  "Overall" : 5.0,
                  "Value" : 4.0,
                  "Service" : 5.0,
                  "Rooms" : "5"
              },
              "AuthorLocation" : "...",
              "Title" : "...",
              "Author" : "...",
              "ReviewID" : "...",
              "Content" : "...",
              "Date" : ISODate("...")
          }
      ],
      "HotelInfo" : {
          "Name" : "Hilton Garden Inn Baltimore White Marsh",
          "HotelURL" : "...",
          "Price" : "...",
          "Address" : "...",
          "HotelID" : "...",
          "ImgURL" : "..."
      }
  },
  ... // More hotel entries
]

Что я в основном пытаюсь сделать, это просмотреть каждый из этих гостиничных документов в массиве и получить список объектов сназвание отеля и количество оценок 5 "Overall".

Желаемый вывод:

{ _id: "Hiltop Inn", numberOfFiveStarReviews: 3 },
{ _id: "Hot Hotel", numberOfFiveStarReviews: 2 },
{ _id: "Cool Hotel", numberOfFiveStarReviews: 6 }

и т. Д.

Я застрял на этом некоторое время и пробовал разные вещи с filter или другими средствами агрегации, но у меня нетне смог заставить его работать.

Вот что у меня так далеко:

db.reviews.aggregate([
  { $unwind: "$Reviews" },
  { $unwind: "$Reviews.Ratings" },
  { 
      $group : { 
          _id: "$HotelInfo.Name", 
          countOfFiveStarRatings: {  
              // NOT SURE WHAT TO DO HERE
          } 
      } 
  }
])

Не уверен, что есть лучший подход, но это то, с чем я играл некоторое время.Я немного новичок в MongoDB, поэтому любая помощь обязательно будет оценена, спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

Я смог решить эту проблему, узнав, что могу продолжать делать project и использовать прошлые результаты, пока не получу то, что хочу.

Решение:

db.reviews.aggregate([
    { $unwind: "$Reviews" },
    { $unwind: "$Reviews.Ratings" },
    {
        $group : {
            _id: "$HotelInfo.Name",
            reviews: {
                $push: "$Reviews.Ratings.Overall"
            }
        }
    },
    {
        $project: {
            _id: 1,
            fiveStarReviews: {
                $filter: {
                    input: "$reviews",
                    as: "rev",
                    cond: {
                        $eq: ["$$rev", 5]
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            name: "$_id",
            countOfFiveStarReviews: {
                $size: "$fiveStarReviews"
            }
        }
    }
])
...