也不在Mongoose中查询不使用_id字段

时间:2014-11-04 03:19:38

标签: node.js mongodb mongoose mongodb-query

好的,所以我用MEAN.js建立了一个使用Mongoose的项目。

我想搜索MongoDB中的所有用户,其中email或displayName字段与正则表达式匹配且_id与某组ID不匹配。

这是我正在做的查询:

var re = new RegExp(req.body.pattern, 'i');
var memberIDs = '';

req.body.members.forEach(function(member){ //members have a user field which is an ObjectID
    memberIDs += (member.user + ' ');
});
memberIDs += req.user._id;


 User.find().or([{ 'displayName': { $regex: re }},
                 { 'email': { $regex: re }}])
               .nor([{'_id' : memberIDs}])
               .select('displayName email')
               .exec(function(err, users) {
                    if(err){
                        res.status(400).send({
                            message: errorHandler.getErrorMessage(err)
                        });
                    }else{              
                        res.json(users);
                    } 
                });
    };

这不起作用,我从错误中得到的消息只是一个空字符串。 没有.nor()方法,查询工作正常。我可以不像这样使用_id字段吗?

1 个答案:

答案 0 :(得分:0)

你这样做是错的。这是第一个非常错误的事情:

req.body.members.forEach(function(member){ 
    //members have a user field which is an ObjectID
    memberIDs += (member.user + ' ');
});

这只是加入一个“空格分隔”字符串,该字符串对查询语法的任何部分都无效。

我认为有些混淆来自.select()等允许完成此类事情的某些形式。但作为一般论点,这是无效的。

我还猜测你有不同于JavaScript的语言背景,也没有动态类型语言。如果你有,那么你可能不会找到“辅助方法”,并且会在代码中动态构造查询对象,这是熟悉动态语言的人所习惯的。

所以你想要一个“数据结构”。并且你想要它的有效运算符$nin采用参数的“列表”或“数组”:

var excludeList = [];

req.body.members.forEach(function(member){ 
    //members have a user field which is an ObjectID
    excludeList.push( member.user );
});

// And finally the current id value
excludeList.push( req.user._id );

User.find(
   { 
       "$or": [
            { "displayName": { "$regex": re } },
            { "email": { "$regex": re } }
       ],
       "_id": { "$nin": excludeList }
   },
   'displayName email',
   function(err,users) {
       // work with results here

   }
);

如果你真的坚持使用“辅助方法”,那么你就像这样加入它们:

User.find().or([
    { "displayName": { "$regex": re } },
    { "email": { "$regex": re } }
]).where("_id").nin(excludeList)
.select("displayName email")
.exec(function(err,users) {
   // work with content here
});

只要您没有覆盖架构定义中_id字段的“类型”,就会自动从字符串转换为ObjectId值。

相关问题