Come somma dei valori di campo raccolte in mongoose

0

Domanda

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

Volevo somma likeLength valori in tutti i Post collezioni filtrati dall'postedBy campo e di ottenere il riassunto risultato che tipo integer. Ho provato totalLikes funzione di cui sopra, ma non poteva fare.

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

Forse questo può aiutare

  • fare la stringa req.profile._id per ObjectId
  • gruppo null tutti sono della stessa postedBy quindi, tutti i documenti che sono passati nel gruppo. (gruppo null significa insieme di tutti 1 gruppo) (il gruppo era ok, ma anche questo è più semplice)
  • annullata la _id per ottenere come risultato [{"total_count" : 20}] per esempio

*prima di eseguire il test il test di gruppo se $match opere e documenti sono trovati.

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

Vi ringrazio tanto . Ho anche fatto con questa funzione $gruppo: { _id: "$postedBy",sumLikes: {$somma: {$size: "$ama" }}}, Ma come ottenere questo tipo di dati , intendo intero , e di inviare il numero di client?
jdee

query restituisce sempre un array di documenti (o array vuoto se non viene trovato). Il più vicino si può ottenere è questo [{total_count : 20 }] se si desidera che questo è possibile rimuovere il _id con project o unset
Takis _

Ti ringrazio tanto e mi dispiace molto per sprecare il vostro tempo, ma penso che non è un mio problema. Io uso reagire sul client e quando ho questi dati dal server incontro con questo {_pipeline: Array(3), opzioni di: { ... }}, come posso raggiungere il mio numero :). Tuttavia probabilmente devo fare una nuova domanda per che, a causa del formato.
jdee

aggregazioni di ritorno cursori, e sono molti metodi, uno semplice è toArray() e da lì si ottiene con js dopo. vedere la mangusta documentazione
Takis _

in realtà io uso questi butget nessun risultato 1) console.log(statistiche?._pipeline?.mappa((item)=> ( <p > {item[1]} </p>) e 2) statistiche._pipeline[1]
jdee

se avete problemi con js, magari fare una nuova domanda , io uso java/clojure in generale, ma molte persone possono aiutare
Takis _

Grazie andrò a vedere che e chiede una nuova domanda se poteva fare . Grazie ancora
jdee
0

La soluzione è la seguente. Con il risultato[0] il risultato sarà un oggetto con sumLikes proprietà.

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

In altre lingue

Questa pagina è in altre lingue

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