sql >> Database >  >> NoSQL >> MongoDB

Hoe de nieuwste N-records van elke groep in Mongodb te krijgen?

In mongoDB 3.2 u kunt dit uitvoeren door de geaggregeerde zoekopdracht van het volgende formulier te gebruiken:

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

Het is erg moeilijk om hetzelfde te bereiken met mongoDB 3.0. Er is een heel vuile truc om dit in 3.0 te bereiken. Het omvat een aantal stappen en andere verzamelingen.

Voer eerst een aggregatie uit en voer het resultaat uit naar een tijdelijke verzameling met de naam 'aggr_out'

Vraag:

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

Met behulp van bovenstaande query, zal mostRecentTitle alle recente titels hebben, gerangschikt van index 0, 1, 2, ... Als u tevreden bent met dit resultaat, gebruikt u dit omdat u het resultaat al in indexen 0,1 en 2 van mostRecentTitle hebt. Andere titels kunnen eenvoudig worden genegeerd aan de applicatiezijde.

Als je nog steeds niet tevreden bent, voer dan een update uit op de uitvoerverzameling 'aggr_out' en lees gegevens uit deze verzameling. De vraag is,

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

Met de bovenstaande bewerking wordt de array mostRecentTitle gesegmenteerd zodat deze de meest recente drie titels heeft. Lees deze collectie om het gewenste resultaat te krijgen.




  1. Hoe arrays van meerdere documenten samenvoegen in MongoDB?

  2. $in vereist een array als tweede argument, gevonden:missing

  3. TypeError:kan eigenschap 'items' van null niet lezen in monogdb met nodejs

  4. C# MongoDB complexe klasse-serialisatie