#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}