$count / $sortByCount în MongoDB & NoSQL

Agregare & Analytics MongoDB 3.4

Etapa $count numără documentele ajunse în acel punct al pipeline-ului; $sortByCount numără pe valori și ordonează descrescător.

Sintaxă
{ $count: <numeCamp> }
{ $sortByCount: <expresie> }

Ce face $count / $sortByCount

$count: 'livrate' întoarce un singur document, { livrate: <număr> }, cu numărul de documente care au ajuns în acea etapă. Este echivalent cu un $group cu _id: null și $sum: 1. Dacă niciun document nu ajunge acolo, nu întoarce nimic (nici măcar 0).

$sortByCount grupează după o expresie, numără documentele din fiecare grup și le ordonează descrescător după număr: un „top valori” într-o singură etapă. Ambele există din MongoDB 3.4.

Parametri

Parametru Descriere
numeCamp Numele câmpului cu rezultatul (nu poate începe cu $ și nu poate conține punct).
expresie Valoarea după care se numără (la $sortByCount).

Ce returnează

$count: un document cu numărul. $sortByCount: documente { _id, count } ordonate descrescător.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

use magazin
db.comenzi.insertMany([
  { _id: 1, client: 'Ana', oras: 'Iași', total: 120, status: 'livrata', produse: ['caiet', 'pix'] },
  { _id: 2, client: 'Dan', oras: 'Cluj', total: 85, status: 'noua', produse: ['carte'] },
  { _id: 3, client: 'Ioana', oras: 'Iași', total: 240, status: 'livrata', produse: ['rucsac', 'caiet', 'pix'] },
  { _id: 4, client: 'Mihai', oras: 'Brașov', total: 60, status: 'anulata', produse: [] }
])

Exemplul 1: Câte comenzi livrate

Rezultatul are un singur câmp, cu numele ales.

db.comenzi.aggregate([{ $match: { status: 'livrata' } }, { $count: 'livrate' }])

Ieșire în mongosh

[ { livrate: 2 } ]

Exemplul 2: Câte comenzi pe oraș, în ordine

Iași are două comenzi; între orașele cu același număr, ordinea poate diferi.

db.comenzi.aggregate([{ $sortByCount: '$oras' }])

Ieșire în mongosh

[
  { _id: 'Iași', count: 2 },
  { _id: 'Cluj', count: 1 },
  { _id: 'Brașov', count: 1 }
]

Greșeli frecvente

  • Când nimic nu se potrivește, $count nu întoarce { livrate: 0 }, ci un rezultat gol; aplicația trebuie să trateze acest caz.
  • Pentru numărarea documentelor unei colecții după un filtru, countDocuments() este mai simplu.

Comenzi înrudite

  • $group: Etapa $group grupează documentele după o cheie și calculează totaluri: $sum, $avg, $min, $max, $push, $addToSet.
  • $match: Etapa $match păstrează în pipeline doar documentele care se potrivesc filtrului, cu aceeași sintaxă ca find().
  • distinct(): Întoarce valorile unice ale unui câmp din colecție, opțional doar pentru documentele care se potrivesc unui filtru.
  • $facet: Etapa $facet rulează mai multe sub-pipeline-uri pe aceleași documente și întoarce toate rezultatele într-un singur document.