2014-11-04 30 views
0

好吧,所以我有一個項目與MEAN.js,它使用貓鼬設置。在Mongoose查詢不與_id字段工作

我想要搜索MongoDB中電子郵件或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

你這樣做都是錯誤的。這是第一個真正的錯誤的東西:

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 2014-11-04 12:48:46

+0

沒有設法編輯以前的評論。 我使用空格字符串的原因是因爲這就是貓鼬的文檔對nor操作符所說的。 你說我來自不同的背景是正確的,但我知道我可以像這樣構建查詢對象,我會這麼做的,這可能是因爲我是MongoDB和Mongoose的新手。我也不知道美元運營商。 貓鼬的文檔使用輔助方法很多,有沒有什麼理由爲什麼我沒有他們更好? – tiansivive 2014-11-04 13:00:25

+0

@lokias如果您閱讀答案中的內容,這非常符合我的說法。這是由於將參數誤解爲「空格分隔的字符串」或對象記號提供的。如果你注意到上述所有內容,那麼查詢語句的「字段選擇」部分總是被寫爲貓鼬翻譯的「字符串」而不是對象形式「{」displayName「:1,」email「:1}'which它解釋爲。這與您開始列表的條件不同。即''_id「:」1 2 3 4 5 6 7「'作爲七個單獨的值。這是錯誤的,所以你錯了 – 2014-11-04 14:33:13