我目前正在尝试根据登录的用户来显示数据库中的产品。当前,如果登录的用户拥有产品(与用户无关,他们是他们自己的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设置为布尔值。
答案 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
如果有要匹配的特定用户