sql >> Databasteknik >  >> NoSQL >> MongoDB

Att hålla fältet i mongodb grupp av

Jag tror att den här frågan är en lösning på det du frågar:

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

Det finns några alternativ med hur du vill se resten av fälten. Jag valde att skjuta typ2 till en array (medger dubbletter), ta det första värdet för year och month eftersom de alltid kommer att vara 2015 och 4 per din matchning, och addToSet dagen till en array (som inte tillåter dubbletter). Ett annat alternativ skulle vara att skjuta in hela dokumentet i en array av matchningar, men man bör vara försiktig med det på stora samlingar.

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



  1. Varför kräver MongoDB `unique:true` för att skapa en samling?

  2. Hur man kör ett kommando en gång i Docker compose

  3. Selleri/Redis samma uppgift utförs flera gånger parallellt

  4. MongoDb-fel med php 7 på xampp CodeIgniter