Como a soma de valores de campo em coleções mangusto

0

Pergunta

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"
      }
    }
  },
])

Eu queria soma likeLength valores em todos os Post coleções filtrada por postedBy de campo e obter a soma do resultado que tipo de número inteiro. Eu tentei totalLikes função acima, mas não podia fazer isso.

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

Talvez isso possa ajudar

  • verifique a seqüência de caracteres req.profile._id para ObjectId
  • grupo null todos são da mesma postedBy assim, todos os documentos passados no grupo. (grupo nulo significa que toda a coleção do 1 ° grupo) (o grupo foi ok também, mas isso é mais simples)
  • anular a _id para obter como resultado [{"total_count" : 20}] por exemplo

*antes de testar o teste do grupo se $match obras e documentos são encontrados.

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

Muito obrigado . Eu também fiz isso com esta função $grupo: { _id: "$postedBy",sumLikes: {$soma: {$tamanho: "$gosta" }}} Mas como fazer com que esses dados , eu quero dizer inteiro , e enviar o número do cliente?
jdee

consultas sempre devolve matrizes de documentos (ou matriz vazia se nada for encontrado). O mais perto que você pode obter é esse [{total_count : 20 }] se você quer isso, você pode remover o _id com project ou unset
Takis _

Muito obrigado e eu estou realmente triste por perder o seu tempo, mas eu acho que não é problema meu. Eu uso reagir no cliente e quando eu chegar de dados a partir do servidor de me encontrar com este {_pipeline: Matriz(3), opções: {...}} então, como eu posso alcançar o meu número :). No entanto, provavelmente vou ter que fazer uma nova pergunta para que, por causa do site do formato.
jdee

as agregações de retornar os cursores, e eles têm muitos métodos, um simples, um é toArray() e a partir daí você começa com js depois. consulte a documentação mangusto
Takis _

na verdade, eu uso estes butget nenhum resultado 1) do console.log(stats?._pipeline?.mapa((item)=> ( <p > {item[1]} </p>) e 2) as estatísticas._pipeline[1]
jdee

se você tiver problemas com js, talvez fazer nova pergunta , eu uso o java/clojure em geral, mas muitas pessoas podem ajudar
Takis _

Obrigado, vou olhar para isso e vai pedir nova pergunta se não poderia fazê-lo . Obrigado novamente
jdee
0

A solução para isso é a seguinte. Com o resultado[0] o resultado será um objeto com sumLikes propriedade.

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

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................