基于登录用户的条件查询

时间:2019-03-16 06:01:51

标签: javascript mongodb

我目前正在尝试根据登录的用户来显示数据库中的产品。当前,如果登录的用户拥有产品(与用户无关,他们是他们自己的schmea),则可以导航至产品页面,然后看他们的产品。如果用户登录的是管理员,我还想查看产品。我目前正在使用此设置。我试图用$or运算符来执行此操作,但是我觉得那是错误的。

    // Get all products for the admin page if the user is logged in
    exports.getProducts = (req, res, next) => {
        //Product.find({userId: req.user._id}) <-- this works for finding  products that the user logged in created
          Product.find({$or: [{userId: req.user._id}, {userId: req.user.isAdmin}]) <-- This is my attempt to get products as admin
            .then(products => {
                res.render('admin/products', {
                    // Create a variable called prods that will store all products from the found products in the DB
                    prods: products,
                    pageTitle: 'Admin Products',
                    path: '/admin/products',
                });
            })

更正确的方法是什么?我知道这不起作用,因为看到userId正在拉回ObjectId,而不是将isAdmin设置为布尔值。

1 个答案:

答案 0 :(得分:1)

您实际上要查找的内容实际上不是使用“查询运算符”完成的,而是在查询本身的构造中完成的:

.gitignore

或者甚至更适合使用三元操作的“ inline”

exports.getProducts = (req, res, next) => {
  let query = {};                 // Default as a empty object
  if ( !req.user.isAdmin ) {      // Only add criteria when NOT admin
    query.userId = req.user._id;
  }

  // Then run the query
  Product.find(query)
    .then(prods => res.render({
      prods, pageTitle: 'Admin Products', path: '/admin/products'
    }))
    .catch(err => {
      // handle any errors, probably passed to next
    });

};

这很有意义,因为您将Product.find((req.user.isAdmin) ? {} : { userId: req.user._id }) 传递为“空” query,这意味着当{}一切isAdmin,或者您实际上正在发送以匹配当前的userId值,即

true

如果有要匹配的特定用户