Есть ли способ сделать несколько операций findById для данного массива _ids? - PullRequest
0 голосов
/ 24 марта 2019

Я использую 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;
                }
            });
        })
...
...