Cum pentru a rezuma valorile câmpului în colecții din mangusta

0

Problema

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

Am vrut să-suma likeLength valori în toate Post colecții filtrate dupa postedBy domeniu și de a obține rezumat rezultat ce tip de număr întreg. Am încercat totalLikes funcție de mai sus, dar nu a putut face.

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

Poate asta te poate ajuta

  • face string req.profile._id pentru a ObjectId
  • grup de null toate sunt la fel postedBy deci tot documentul, care a trecut sunt în grup. (grup de nul înseamnă toate de colectare 1 grup) (grupul dvs. a fost ok, de asemenea, dar acest lucru este mai simplu)
  • demarca _id pentru a obține ca rezultat [{"total_count" : 20}] de exemplu

*înainte de testarea în grup a testa dacă $match lucrări și documente sunt găsite.

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

Vă mulțumesc foarte mult . Am făcut, de asemenea, cu această funcție $grup: { _id: "$postedBy",sumLikes: {$suma: {dimensiune$: "$i place" }}} Dar cum pentru a obține aceste date , adică întreg , și trimite numărul de client?
jdee

interogările se întoarce mereu tablouri de documente (sau un array gol dacă nu este găsit). Cel mai aproape puteți obține asta e [{total_count : 20 }] dacă doriți acest lucru, puteți elimina _id cu project sau unset
Takis _

Vă mulțumesc foarte mult și îmi pare foarte rău pentru pierzi timpul, dar cred că asta nu este problema mea. Eu folosesc reacționa pe client și atunci când am obține aceste date de la server am întâlnire cu acest {_pipeline: Array(3), opțiuni: {...}} așa cum pot ajunge la numărul meu :). Cu toate acestea, probabil, trebuie să pun o nouă întrebare pentru că, din cauza site-ului format.
jdee

agregări reveni cursoare, și ei au mai multe metode, una simpla este toArray() și de acolo le-ai luat cu js după. vezi mangusta documentația
Takis _

de fapt, eu folosesc aceste bugetare la exclusive niciun rezultat 1) consola.log(statistici?._pipeline?.harta((element)=> ( <p > {element[1]} </p>) și 2) statistici._pipeline[1]
jdee

dacă ai probleme cu js, poate cere nouă întrebare , eu folosesc java/clojure, în general, dar mulți oameni te pot ajuta
Takis _

Vă mulțumesc să mă uit la asta și va cere nouă întrebare dacă nu a putut face . Vă mulțumesc din nou
jdee
0

Soluția este următoarea. Cu rezultat[0] rezultatul va fi un obiect cu sumLikes proprietate.

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

În alte limbi

Această pagină este în alte limbi

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