复杂的猫鼬查询与$ where

时间:2015-09-01 13:11:35

标签: javascript node.js mongodb mongoose mean-stack

我对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吗?

2 个答案:

答案 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