Когда пользователь нажимает кнопку, его идентификатор пользователя и идентификатор продукта отправляются на мой запрос ниже. Я хочу проверить, существует ли этот продукт, и если это так, то проверить, существует ли определенный идентификатор пользователя в массиве объектов в том же документе. Я попробовал следующее, но когда я тестирую его с другими продуктами, где userId отсутствует в массиве, он говорит мне, что пользователь существует. Таким образом, кажется, что проверяются все продукты, а не только тот, которому я передаю идентификатор продукта.
Product.findById(productId).then(product => {
if (!product) {
console.log("no product found");
}
return Product.find({ "requests.userId": userId })
.then(result => {
if (result === undefined || result.length == 0) {
res.status(200).json({ message: "You can add it!" });
} else {
res.status(200).json({ message: "You cannot add this again!" });
}
})
.catch(err => {
console.log(err);
});
});
});
Во-первых, Ln 4, вы пытаетесь проверить идентификатор пользователя в полном объекте Product из схемы Mongo.
Если ваш userId хранится в каждом отдельном продукте, то измените Ln 4, Product на product.
Что вам нужно сделать, это найти продукт, который удовлетворяет 2 условия одновременно:
requests
То, что делает ваш запрос - это тестирование двух условий по отдельности. Сначала вы находите продукт, а затем проверяете, существует ли какой-либо продукт, удовлетворяющий условию 2.
Чтобы применить оба условия к одному и тому же продукту, используйте один запрос:
Product.find({ _id: productId, 'requests.userId': userId })
.then(product => {
if (product) {
const [result] = product; // take the first matched item
// ... do stuff with result
}
})
В качестве альтернативы вы можете сделать все это в памяти:
Product.findById(productId).then(product => {
if (!product) {
console.log("no product found");
// ... potentially send an error here
return;
}
// find a match in memory
const [result] = product.requests.filter(uid => uid === userId);
if (result) {
// ...
}
});