sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan får man de seneste N optegnelser for hver gruppe i mongodb?

I mongoDB 3.2 du kan udføre dette ved at bruge den samlede forespørgsel i følgende form:

db.collection.aggregate(
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)

Det er meget svært at opnå det samme ved at bruge mongoDB 3.0. Et meget beskidt trick er der for at opnå dette i 3.0. Det involverer et par trin og anden indsamling.

Foretag først en aggregering og output resultatet til en midlertidig samling kaldet 'aggr_out'

Forespørgsel:

db.collection.aggregate([
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {city: '$_id', mostRecentTitle: '$title'}},
  {$out: 'aggr_out'}]
)

Ved at bruge ovenstående forespørgsel vil mostRecentTitle have alle de seneste titler ordnet fra indeks 0, 1, 2, ... Hvis du er tilfreds med dette resultat ved at bruge dette, da du allerede har resultatet i indeks 0,1 og 2 i mostRecentTitle. Andre titler kan simpelthen ignoreres i applikationssiden.

Hvis du stadig ikke er tilfreds, så lav en opdatering på outputsamlingen 'aggr_out' og læs data fra denne samling. Forespørgslen er,

db.aggr_out.update(
  {},
  {$push: {
    mostRecentTitle: {$each:[], $slice:3}
    }
  }
)

Ovenstående handling vil opdele mostRecentTitle-arrayet, så det har de seneste tre titler. Læs denne samling for at få det ønskede resultat.




  1. Advarsel om fortabelse af MongoDB-mangos

  2. Hvor ofte skal jeg åbne/lukke min Booksleeve-forbindelse?

  3. lokationsobjekt forventet, placeringsmatrix ikke i korrekt format

  4. Mens MongoDB gemmer en samling, opretter MongoDB et indeksnavn, som er for langt og overskrider grænsen på 127 bytes. Hvordan løses dette. kan jeg deaktivere indeksering?