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

Mantenere il campo nel gruppo mongodb di

Credo che questa domanda sia una soluzione per quello che stai chiedendo:

db.test.aggregate([
  // Filter the docs based on your criteria
  {$match: {
    type1: {$in: ['type1A', 'type1B']},
    type2: {$in: ['type2A', 'type2B']},
    'date.year': 2015,
    'date.month': 4,
    'date.type': 'day',
    'date.day': {$gte: 4, $lte: 7}
  }},

  // Group by iddoc and type1 and count them
  {$group: {
    _id: { iddoc: '$iddoc', type1: '$type1' },
    sum: {$sum: 1},
    type2: { $push: '$type2' },
    year: { $first: '$date.year' },
    month: { $first: '$date.month' },
    day: { $addToSet: '$date.day' }
  }},

  // Sort by sum, descending
  {$sort: {sum: -1}}
])

Ci sono alcune opzioni su come vuoi vedere il resto dei campi. Ho scelto di eseguire il push di type2 in un array (consentendo i duplicati), prendere il primo valore per year e month poiché quelli saranno sempre 2015 e 4 per la tua operazione di corrispondenza e addToSet il giorno in un array (non consentendo duplicati). Un'altra opzione sarebbe quella di inserire l'intero documento in un array di corrispondenze, ma si dovrebbe fare attenzione con questo su raccolte di grandi dimensioni.

{$group: {
    _id: { iddoc: '$iddoc', type1: '$type1' },
    sum: {$sum: 1},
    matches: { $push: '$$ROOT' }
  }},