найти, существует ли товар, и если да, проверить, существует ли пользователь в массиве товаров. - PullRequest
0 голосов
/ 12 января 2019

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

Ответы [ 2 ]

0 голосов
/ 12 января 2019

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

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

0 голосов
/ 12 января 2019

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

  1. Имеет конкретный идентификатор
  2. Имеет определенную строку в массиве requests, поданную

Что делает ваш запрос, так это индивидуально тестирует 2 условия. Сначала вы находите продукт, а затем проверяете, существует ли какой-либо продукт, который удовлетворяет условию 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) {
      // ...
    }
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...