使用 $where 进行复杂的猫鼬查询

complex mongoose query with $where

我对 mongoose 查询感到非常头疼,我对它还是很陌生,想知道是否有人可以提出解决方案。

我在图库集合中有以下字段。

然后我根据当前用户 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)
});