好的,所以我用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字段吗?
答案 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
值。