Найдите наборы из 3 или более документов, имеющих одинаковое значение «дата»

#mongodb #mongoose

Вопрос:

Мне нужно вернуть «заблокированные дни» из API, что означает даты, которые повторяются не менее 3 раз в значениях «Дата отправки» в документах для сбора заказов.

Пример:

 {
shippingDate: 'sunday'
},
{
shippingDate: 'monday'
},
{
shippingDate: 'sunday'
},
{
shippingDate: 'tuesday'
},
{
shippingDate: 'sunday'
},
{
shippingDate: 'wednesday'
}
 

Будет возвращать ['sunday']

Ответ №1:

Вы можете использовать агрегацию, подобную этой:

  • $group по дням, добавляя один, используя $sum , чтобы получить за каждый день, сколько раз появляется.
  • $match где день появляется не менее трех раз
  • $project вернуть только название дня.
 db.collection.aggregate([
  {
    "$group": {
      "_id": "$shippingDate",
      "days": {
        "$sum": 1
      }
    }
  },
  {
    "$match": {
      "days": {
        "$gte": 3
      }
    }
  },
  {
    "$project": {
      "days": 0
    }
  }
])
 

Который возвращает

 [
  {
    "_id": "sunday"
  }
]
 

MongoDB использует формат JSON, поэтому вы извлекаете формат JSON. Используя мангуста, вы можете попробовать это:

 const queryResult = [
  {
    "_id": "sunday"
  }
]

const desiredValue = queryResult.map(m => m._id)

console.log(desiredValue) 

Пример здесь