Как суммировать значения полей в коллекциях в мангусте

0

Вопрос

const PostSchema = new mongoose.Schema({
  title: {
    type: String,
  },
  text: {
    type: String,
    required: true,
  }
  postedBy: {
    type: mongoose.Schema.ObjectId,
    ref: "User",
  }
  likes: [{
    type: mongoose.Schema.ObjectId,
    ref: "User",
  }, ],
  likeLength: {
    type: Number,
    default: 0
  }
});


let totalLikes = Post.aggregate([{
    $match: {
      postedBy: req.profile._id,
    },
  },
  {
    $group: {
      _id: "$postedBy",
      total_count: {
        $sum: "$likeLength"
      }
    }
  },
])

Я хотел суммировать значения длины вероятности во всех коллекциях записей, отфильтрованных по полю postedBy, и получить суммированный результат, какой тип целого числа. Я попробовал использовать функцию totalLikes выше, но не смог этого сделать.

javascript mongodb mongoose node.js
2021-11-23 17:31:51
2
0

Может быть, это поможет

  • сделайте строку req.profile._id к объекту
  • сгруппировать по null все они из одного и того же postedBy таким образом, все переданные документы находятся в группе. (группа по null означает всю группу коллекции 1) (ваша группа также была в порядке, но это проще)
  • снимите флажок _id чтобы получить в результате [{"total_count" : 20}] например

*перед тестированием группового теста, если $match работы и документы найдены.

let totalLikes = Post.aggregate([{
    $match: {
      postedBy: mongoose.Types.ObjectId(req.profile._id),
    }
  },
  {
    $group: {
      _id: null,
      total_count: {
        $sum: "$likeLength"
      }
    }
  },
  {"$unset": ["_id"]}
])
2021-11-23 18:51:11

Огромное спасибо. Я также сделал это с помощью этой функции $group: { _id: "$postedBy",sumLikes: {$sum: {$size: "$нравится" }}} Но как получить эти данные , я имею в виду целое число , и отправить это число клиенту?
jdee

запросы всегда возвращают массивы документов (или пустой массив, если ничего не найдено). Чем ближе вы можете подойти, тем это [{total_count : 20 }] если вы хотите этого, вы можете удалить _id с project или unset
Takis _

Большое вам спасибо, и мне действительно жаль, что я трачу ваше время впустую, но я думаю, что это не моя проблема. Я использую react на клиенте, и когда я получаю эти данные с сервера, я сталкиваюсь с этим {_pipeline: Массив(3), параметры: {...}} так как я могу связаться со своим номером :). Однако мне, вероятно, придется задать для этого новый вопрос из-за формата веб-сайта.
jdee

агрегации возвращают курсоры, и у них есть много методов, один из которых прост toArray() и оттуда вы получите их с помощью js после. смотрите документацию по мангусту
Takis _

на самом деле я использую их, но не получаю результата 1) console.log(статистика?._pipeline?.карта((пункт)=> ( ><p > {пункт[1]} <p ></p>) и 2) статистика._pipeline[1]</p>
jdee

если у вас есть проблемы с js, возможно , задайте новый вопрос, я вообще использую java/clojure, но многие люди могут помочь
Takis _

Спасибо, я посмотрю на это и задам новый вопрос, если не смог этого сделать . Еще раз спасибо
jdee
0

Решение для этого заключается в следующем. С результатом[0] результатом будет объект со свойством sumLikes.

aggregate([
      {
        $match: {postedBy: req.profile._id}
      },
      {
        $group: {
          _id: null,
          sumLikes: {
            $sum: "$likeLength",
          },
        },
      },
      { $unset: ["_id"] },
    ], function(err, result) {
      if(err){
        console.log(err)
      }else{
        res.json(result[0])
      }})

2021-11-23 18:35:38

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................