我对mongoose查询感到非常头疼,我还是很陌生,并想知道是否有人可以提出解决方案。
我在图库集中有以下字段。
状态('公共'或'限制')的价值,
限制(canview'或' cantview'的价值),
canview(允许查看图库的用户ID(ObjectIds)数组)
然后我根据当前用户ID检查字段,以查看哪些项目可见。
如何选择以下所有项目
a)具有“状态”的所有项目' =' public'
b)具有“状态”的所有项目' ='限制'在哪里限制' =' canview'和' canview'包含UserID
我无法使用$和$或者这样做,所以尝试用$ 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吗?
答案 0 :(得分:1)
嘿我建议点击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)
});
答案 1 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/itmp"
android:icon="@mipmap/ic_launcher"
android:title="Profile"
app:showAsAction="always"/>
</menu>
函数不能引用本地$where
函数,因为existsInArray
函数是在不存在本地函数的服务器上执行的。
但是你不应该使用$where
,因为你可以使用一个简单的$where
查询来利用你可以直接查询像$or
这样的数组字段的事实“包含”行为:
canview