NodeJS MongoDB Подсчитывает записи с одинаковым значением в поле

#node.js #mongodb

Вопрос:

У меня есть следующая коллекция

 _id: someid
name: Name 1
status: 0
ref: 152

_id: someid
name: Name 1
status: 0
ref: 152

_id: someid
name: Name 1
status: 3
ref: 152

_id: someid
name: Name 1
status: 0
ref: 273

_id: someid
name: Name 1
status: 3
ref: 679
 

Я хотел бы получить результат, который скажет мне, сколько раз «ссылка» появляется с одним и тем же значением, когда запись имеет статус что угодно, кроме 3. Так, например, результат, который я ищу, в основном

 {"152": 2, "273": 1, "679": 0}
 

Так как «ссылка: 152» появляется 2 раза, когда статус не равен 3, а «ссылка: 273» появляется 1 раз, когда статус не равен 3. Я использую NodeJS, Express и MongoDB. Я попытался агрегировать, что в какой-то степени работает, однако, поскольку 679 имеет 0, результат агрегирования пропускает «679: 0», и это приводит к тому, что шаблон React выдает ошибку, объявляющую его неопределенным. Использование агрегирования также форматирует его по-разному, поэтому иногда в разных строках отображается неправильное количество. Я чувствую, что если бы я мог получить доступ к подсчету, используя номер ссылки в качестве ключа, это было бы точно, но я не могу понять, как этого добиться.

ИЗМЕНИТЬ: Я решил свою проблему следующим образом:

 const count = {}

docs.map((doc) => {
    count[doc.ref] = 0
})

docs.map((doc) => {
    doc.status < 3 amp;amp; count[doc.ref]  
})
 

Который возвращает именно то, что я указал выше, однако мне было интересно, есть ли еще более чистый способ сделать это?

Ответ №1:

Вы также можете использовать функцию Array.reduce ().

 const countRef = docs.reduce((count, doc) => {
  count[doc.ref] = (doc.status !== 3) ? (count[doc.ref] || 0)   1 : (count[doc.ref] || 0);
  return count;
}, {});

// countRef - {"152": 2, "273": 1, "679": 0}