查找产品是否存在,如果存在,请检查用户是否存在于对象的产品数组中

时间:2019-01-12 17:48:31

标签: javascript node.js mongodb express mongoose

当用户单击按钮时,他们的userId和产品ID将发送到下面的我的查询中。我想检查该产品是否存在,如果存在,然后检查同一文档中的对象数组中是否存在特定的userId。我已经尝试了以下方法,但是当我使用数组中不存在userId的其他产品对其进行测试时,它告诉我该用户存在。因此,似乎正在检查所有产品,而不只是检查我正在传递产品ID的产品。

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 :(得分:1)

您需要做的是找到同时满足两个条件的产品:

  1. 具有特定的ID
  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) {
      // ...
    }
  });

答案 1 :(得分:1)

首先,Ln 4,您尝试从Mongo模式检查完整的Product对象中的用户ID。

如果您的userId存储在每个产品中, 然后将Ln 4,产品更改为产品。