Получите среднее значение с помощью запроса mon goose - PullRequest
1 голос
/ 13 июля 2020

Я получаю список «спотов» с пн goose, отфильтрованный по местоположению и другим параметрам, с приведенным ниже кодом, который отлично работает. Но я хочу, чтобы значение 'rate' было средним (средним) для всех обзоров, а не списком обзоров. Это агрегация другой коллекции.

вот что я получаю:

{
"_id":"5f0ade7d1f84460434524d3d",
"name":"Fly",
...
"rate":[
    {"_id":"5f0bfca64ca1cc02ffe48faf","spot_id":"5f0ade7d1f84460434524d3d","rate":3}, 
    {"_id":"5f0bfdb44ca1cc02ffe48fb0","spot_id":"5f0ade7d1f84460434524d3d","rate":2}, 
    {"_id":"5f0bfdb44ca1cc02ffe48fb1","spot_id":"5f0ade7d1f84460434524d3d","rate":1}
  ]
},

но мне бы хотелось получить такой результат:

{
   "_id":"5f0ade7d1f84460434524d3d",
   "name":"Fly",
   ...
   "rate": 2
},

Я пробовал много разных вещи, и я думаю, мне нужно использовать $ group, но я не могу понять, как получить правильный результат.

схема обзоров:

const reviewsSchema = new mongoose.Schema({
    _id: {
        type: ObjectId,
        required: true,
    },
    spot_id: {
        type: ObjectId,
        required: true,
    },
    rate: {
        type: Number,
        required: true,
    },
})

схема пятна

const spotsSchema = new mongoose.Schema({
    _id: {
        type: ObjectId,
        required: true,
    },
    name: {
        type: String,
        required: true,
    },
    ...
})

Код:

Spots.aggregate
  ([
    {
      $geoNear: {
          near: { type: "Point", coordinates: [ parseFloat(longitude), parseFloat(latitude) ] },
          distanceField: "location",
          maxDistance: parseInt(distance) * 1000,
          query: {
            $and: [
              { $or : filter },
              { $or : closed },
              { published: true }
            ]
          }
      }
    },
    { $match: {} },
    {
      $lookup:{
        from: 'reviews',
        localField: '_id',
        foreignField: 'spot_id',
        as: 'rate'
      }
    },
  ])

1 Ответ

1 голос
/ 13 июля 2020

Вы действительно близки, вам просто нужно вычислить значение avg, что можно сделать, используя $ map и $ avg вот так:

{
    $addFields: {
      rate: {
        $avg: {
          $map: {
            input: "$rate",
            as: "datum",
            in: "$$datum.rate"
          }
        }
      }
    }
  }

MongoPlayground

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