2014-11-04 1 views
0

좋아, 그래서 Mongoose를 사용하는 MEAN.js로 프로젝트를 설정했습니다.Mongoose의 쿼리도 _id 필드와 함께 작동하지 않습니다.

전자 메일 또는 displayName 필드가 정규식과 일치하고 _id가 특정 ID 집합과 일치하지 않는 MongoDB의 모든 사용자를 검색하려고합니다.

여기서 내가 뭘 쿼리의 :

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

귀하의 잘못을 다하십시오.

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 값으로 변환이 발생합니다.

+0

정말 고마워요, 매력처럼 작동합니다! – tiansivive

+0

이전 메모를 편집 할 수 없었습니다. 내가 공백으로 구분 된 문자열을 사용하는 이유는 그것이 몽유병 문서가 nor 연산자에 대해 말한 것이기 때문입니다. 당신이 다른 배경에서 왔다고 말하는 것이 맞지만, 내가 그런 식으로 쿼리 객체를 만들 수 있다는 것을 알았 더라면 아마도 그랬을 것입니다. 아마도 MongoDB와 Mongoose의 신참이기 때문일 것입니다. 나는 $ nin 연산자에 대해서도 몰랐다. 몽구스 문서는 도우미 메서드를 많이 사용합니다. 왜 내가 그들을 사용하지 않는 것이 더 좋은지 이유가 무엇입니까? – tiansivive

+0

@lokias 이것은 답변에서 내용을 읽으면서 말한 것입니다. 이는 인수가 "공백으로 구분 된 문자열"로 또는 객체 표기법에서 제공된대로 잘못 해석 한 것에서 비롯됩니다. 위의 모든 것을 적어두면, mongoose가 객체 형식 인 {{ "displayName": 1, "email": 1}'이 아니라 "string"을 해석 할 때 쿼리 문의 "field selection" 그것을 해석합니다. 이것은 목록을 시작하는 기준과 동일하지 않습니다. 즉 "_id": "1 2 3 4 5 6 7"을 7 개의 개별 값으로 사용합니다. 그건 틀렸어. 그래서 네가 잘못 됐어. –

관련 문제