Jak součet hodnot polí ve sbírkách mongoose

0

Otázka

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

Chtěl jsem, aby součet likeLength hodnoty ve všech Post sbírky filtrovat podle postedBy pole a získat shrnul výsledek typu celé číslo. Snažil jsem se totalLikes funkce výše, ale nemohl to udělat.

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

Možná to může pomoci

  • aby řetězec req.profile._id na ObjectId
  • skupiny null všechny jsou od stejného postedBy takže všechny dokument, který prošel jsou ve skupině. (skupina null znamená, že všechny kolekce 1 skupina) (vaše skupina byla také ok, ale toto je jednodušší)
  • odstavení _id dostat jako výsledek [{"total_count" : 20}] například

*před testováním skupiny test, pokud $match funguje a dokumenty jsou k dispozici.

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

Děkuji moc . Také jsem pomocí této funkce $skupina: { _id: "$postedBy",sumLikes: {$sum: {$velikost: "$likes" }}} Ale, jak získat tato data , mám na mysli celé číslo , a poslat to číslo klienta?
jdee

dotazy vždy vrací pole dokumentů (nebo prázdné pole, pokud není nalezena). Čím blíže se můžete dostat, je to [{total_count : 20 }] pokud chcete, aby tento můžete odstranit _id s project nebo unset
Takis _

Děkuji moc a omlouvám se pro ztrácíš čas, ale myslím, že to není můj problém. Používám reagovat na klienta a když jsem si tato data ze serveru se setkávám s touto {_pipeline: Array(3), options: {...}} tak jak se můžu dostat moje číslo :). Nicméně asi bych se měl položit nový dotaz pro to, protože webové stránky je formát.
jdee

agregace návrat kurzory, a mají mnoho způsobů, jeden prostý jedna je toArray() a odtud si je s js po. viz mongoose dokumentace
Takis _

vlastně jsem použít tyto butget žádný výsledek 1) konzole.log(statistiky?._pipeline?.mapa((položka)=> ( <p > {item[1]} </p>) a 2) statistiky._pipeline[1]
jdee

pokud máte problémy s js, možná položit nový dotaz , používám java/clojure obecně, ale mnoho lidí může pomoci
Takis _

Děkuji podívám se na to a bude klást novou otázku, jestli nemohl udělat to . Ještě jednou děkuji
jdee
0

Řešení pro to je následující. S výsledkem[0] výsledkem bude objekt s sumLikes majetku.

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

V jiných jazycích

Tato stránka je v jiných jazycích

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