найти, существует ли товар, и если да, проверить, существует ли пользователь в массиве товаров.

1

Когда пользователь нажимает кнопку, его идентификатор пользователя и идентификатор продукта отправляются на мой запрос ниже. Я хочу проверить, существует ли этот продукт, и если это так, то проверить, существует ли определенный идентификатор пользователя в массиве объектов в том же документе. Я попробовал следующее, но когда я тестирую его с другими продуктами, где 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);
    });
  });      
});
Теги:
express
mongoose

2 ответа

0

Во-первых, Ln 4, вы пытаетесь проверить идентификатор пользователя в полном объекте Product из схемы Mongo.

Если ваш userId хранится в каждом отдельном продукте, то измените Ln 4, Product на product.

0

Что вам нужно сделать, это найти продукт, который удовлетворяет 2 условия одновременно:

  1. Имеет конкретный идентификатор
  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) {
      // ...
    }
  });
  • 0
    Большое спасибо за это. Я отредактировал свой оригинальный вопрос (не уверен, что вы можете его увидеть, говорит, что он нуждается в пересмотре?) В любом случае, я разместил его, чтобы вы могли сообщить мне, если все в порядке Дайте мне знать, если вы не видите изменения, и я опубликую код в комментарии
  • 0
    Какая из ваших двух примеров лучше по производительности?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню