Я использую mongoose для взаимодействия с базой данных mongo через интерфейс React.
Я хотел бы разрешить пользователю вводить список _ids и возвращать связанные записи.Прежде чем они будут возвращены, я хотел бы получить автора для каждого и удостовериться, что им разрешено видеть это.(В конце концов я проверю, не является ли возвращенный автор для каждого объекта текущим вошедшим пользователем, а затем вернет 403. Запрещено.)
Некоторые предоставленные _ids могут отсутствовать в базе данных, но я все еще хочу знать, чтозапись с таким идентификатором не существует, а не возвращает ничего.Кажется, что с каждым методом, который я попробовал, Mongo просто пропустит, если не найдет совпадения.
Например, если я использую:
model.find({ '_id': {$in: {*bad_IDvalue1*, *bad_IDvalue2*, *good_IDvalue*}})
Я получу массив содна запись.Я бы предпочел получить массив с двумя «плохими» или нулевыми записями, в которых отсутствует значение в поле ценного автора, и одним хорошим, у которого есть реальный автор.
Моей первой мыслью было использование внешнего forEach.цикл и findByID в каждом цикле.Тогда я мог бы проверить, если (!result)
и если ложно, я бы знал об этом и мог вывести ошибку.Тогда я мог бы подтвердить, что они автор и имеют разрешение на просмотр.Если все хорошо, вставьте запись в массив и вернитесь во внешний интерфейс.Но forEach вызывает странные асинхронные проблемы, когда массив, в который я помещаю данные, возвращается, прежде чем я завершу свои вызовы findByID.Я думаю, что должен быть лучший способ.
В SQL я мог бы сделать внешнее соединение.Я бы взял свой исходный массив ввода и внешний соединить его с таблицей.В возвращенной таблице будет ряд пустых полей в строках введенных неверных _ids.
Я думаю, что .populate может помочь мне здесь, но я не могу понять это.
Вотчто-то, что я попробовал, не сработало:
Card.find({ '_id': { $in: cardIDList }}) //should I use populate instead????
.then(resCards => {console.log(JSON.stringify(resCards))}) //resCards can be EMPTY if they are all bogus IDs
.then(resCards => {
resCards.forEach(resCard => {
if (!resCard) { //doesn't work. Because the returned array doesn't contain a "null" entry
console.log("no card")
cardIDerrors = true;
}
if (resCard.author != req.user.id) {
console.log("forbidden")
cardIDerrors = true;
}
});
})
...