使用 $where 进行复杂的猫鼬查询
complex mongoose query with $where
我对 mongoose 查询感到非常头疼,我对它还是很陌生,想知道是否有人可以提出解决方案。
我在图库集合中有以下字段。
状态('public' 或 'restricted' 的值),
限制('canview' 或 'cantview' 的值),
canview(允许查看画廊的用户的用户 ID (ObjectId) 数组)
然后我根据当前用户 ID 检查字段,看看哪些项目是可见的。
怎么可能 select 以下所有项目
a) 'status' = 'public'
的所有项目
b) 'status' = 'restricted' WHERE 'restricted' = 'canview' AND 'canview' 包含 UserID
的所有项目
我无法使用 $and 和 $or 来执行此操作,因此尝试使用 $where。使用以下全局函数
var existsInArray = function(str,arr) {
// nb: remember we have typeof ObjectID, so lets convert to strings first!
var newarr = arr.toString().split(',');
// now compare..
if(newarr.inArray(str)) {
return true;
}
return false;
};
我希望做这样的事情...
exports.listviewable = function(req, res) {
var reqID = req.user.id;
Gallery
.find()
.$where(function () {
return this.status === "public" || ( this.status === "restricted" && this.restriction === "canview" && existsInArray(reqID, this.canview));
})
.sort('-created')
.exec(function(err, galleries) {
if(err) {
return res.status(400).send({message:getErrorMessage(err)})
} else {
res.json(galleries);
}
});
};
但这没有用 - 我似乎无法在 $where 子句中使用全局 existsInArray 函数?
是否可以这样做(此处类似未解决的问题 how to call external function in mongoose $where and passing this variable),或者是否有更好的方法使用 AND 和 OR 来做到这一点?
$where
函数无法引用您的本地 existsInArray
函数,因为 $where
函数是在不存在该本地函数的服务器上执行的。
但无论如何你都不应该使用 $where
,因为你可以使用一个简单的 $or
查询来实现,它利用了你可以直接查询数组字段的事实,例如 [=16] =] 具有 "contains" 行为:
Gallery
.find({
$or: [
{status: 'public'},
{status: 'restricted', restriction: 'cantview', canview: reqId}
]
})
.sort('-created')
.exec(function(err, galleries) {...});
嘿,我建议您查看 mongo 文档 - 他们有很多这方面的信息。
a)
Gallery.find({status: 'public'}, function(err, data){
console.log(data)
});
b)
Gallery.find({status: 'restricted', restricted: 'canview', canview: reqID }, function(err, data){
});
或两者结合排序...
Gallery.find({$or:[
{status: 'public'},
{status: 'restricted', restricted: 'canview', canview: reqID }
]}, {
sort:{created:-1}
}, function(err, data){
console.log(data)
});
我对 mongoose 查询感到非常头疼,我对它还是很陌生,想知道是否有人可以提出解决方案。
我在图库集合中有以下字段。
状态('public' 或 'restricted' 的值),
限制('canview' 或 'cantview' 的值),
canview(允许查看画廊的用户的用户 ID (ObjectId) 数组)
然后我根据当前用户 ID 检查字段,看看哪些项目是可见的。
怎么可能 select 以下所有项目
a) 'status' = 'public'
的所有项目b) 'status' = 'restricted' WHERE 'restricted' = 'canview' AND 'canview' 包含 UserID
的所有项目我无法使用 $and 和 $or 来执行此操作,因此尝试使用 $where。使用以下全局函数
var existsInArray = function(str,arr) {
// nb: remember we have typeof ObjectID, so lets convert to strings first!
var newarr = arr.toString().split(',');
// now compare..
if(newarr.inArray(str)) {
return true;
}
return false;
};
我希望做这样的事情...
exports.listviewable = function(req, res) {
var reqID = req.user.id;
Gallery
.find()
.$where(function () {
return this.status === "public" || ( this.status === "restricted" && this.restriction === "canview" && existsInArray(reqID, this.canview));
})
.sort('-created')
.exec(function(err, galleries) {
if(err) {
return res.status(400).send({message:getErrorMessage(err)})
} else {
res.json(galleries);
}
});
};
但这没有用 - 我似乎无法在 $where 子句中使用全局 existsInArray 函数?
是否可以这样做(此处类似未解决的问题 how to call external function in mongoose $where and passing this variable),或者是否有更好的方法使用 AND 和 OR 来做到这一点?
$where
函数无法引用您的本地 existsInArray
函数,因为 $where
函数是在不存在该本地函数的服务器上执行的。
但无论如何你都不应该使用 $where
,因为你可以使用一个简单的 $or
查询来实现,它利用了你可以直接查询数组字段的事实,例如 [=16] =] 具有 "contains" 行为:
Gallery
.find({
$or: [
{status: 'public'},
{status: 'restricted', restriction: 'cantview', canview: reqId}
]
})
.sort('-created')
.exec(function(err, galleries) {...});
嘿,我建议您查看 mongo 文档 - 他们有很多这方面的信息。
a)
Gallery.find({status: 'public'}, function(err, data){
console.log(data)
});
b)
Gallery.find({status: 'restricted', restricted: 'canview', canview: reqID }, function(err, data){
});
或两者结合排序...
Gallery.find({$or:[
{status: 'public'},
{status: 'restricted', restricted: 'canview', canview: reqID }
]}, {
sort:{created:-1}
}, function(err, data){
console.log(data)
});