2017-03-15 59 views
0

下面你可以找到我的代碼,我試圖通過一個關鍵詞在Mongoose中搜索字段(名字,姓氏和電子郵件)。不幸的是,它沒有按照我的預期工作。它只返回的結果,如果是進入了全姓或名,但我想獲得導致的所有情況:在Mongoose中搜索名,電子郵件的一個關鍵詞

例子:

用戶名和姓=約翰·史密斯

  1. 情況:關鍵字=喬
  2. 情況:關鍵字=約翰
  3. 情況:關鍵字=約翰釤
  4. 情況:關鍵字=約翰·史密斯
  5. 情況:關鍵字= [email protected]

它使用的名字,姓氏文本索引和電子郵件代碼:

User.findOne({ _id: req.user.id }) 
     .populate({ 
     path: 'friends', 
     select: 'firstName lastName email avatarPath facebookID', 
     match: { $text: { $search: req.query.keyWord } } 
     }) 
     .populate({ 
     path: 'receivedFriendRequests', 
     select: 'firstName lastName email avatarPath facebookID', 
     match: { $text: { $search: req.query.keyWord } } 
     }) 
     .exec(function (err, user) { 
     if (err) { 
      logger.error('Friend 500 ' + err) 
      return res.status(500).json({ 
      code: config.errorCode.status500.code, 
      message: config.errorCode.status500.message 
      }) 
     } 
     if (!user) { 
      logger.error('Friend 404 User does not exist.') 
      return res.status(404).json({ 
      code: config.errorCode.status404.code, 
      message: config.errorCode.status404.message 
      }) 
     }else { 
      if (!user.friends) { 
      logger.error('Friend 404 User friends do not exist.') 
      return res.status(404).json({ 
       code: config.errorCode.status404.code, 
       message: config.errorCode.status404.message 
      }) 
      } 
      return res.json({ 
      receivedFriendRequests: user.receivedFriendRequests.slice(0, 5), 
      data: user.friends 
      }) 
     } 
     }) 

我也嘗試過這種方式,但它是不是也工作所有5個情況:

User.findOne({ _id: req.user.id }) 
     .populate({ 
     path: 'friends', 
     select: 'firstName lastName email avatarPath facebookID', 
     match: { 
      $or: [ 
      { 
       firstName: { $regex: req.query.keyWord, $options: 'i'} 
      }, 
      { 
       lastName: { $regex: req.query.keyWord, $options: 'i'} 
      }, 
      { 
       email: { $regex: req.query.keyWord, $options: 'i'} 
      } 
      ] 
     } 
     }) 
     .populate({ 
     path: 'receivedFriendRequests', 
     select: 'firstName lastName email avatarPath facebookID', 
     match: { 
      $or: [ 
      { 
       firstName: { $regex: req.query.keyWord, $options: 'i'} 
      }, 
      { 
       lastName: { $regex: req.query.keyWord, $options: 'i'} 
      }, 
      { 
       email: { $regex: req.query.keyWord, $options: 'i'} 
      } 
      ] 
     } 
     }) 
     .exec(function (err, user) { 
     if (err) { 
      logger.error('Friend 500 ' + err) 
      return res.status(500).json({ 
      code: config.errorCode.status500.code, 
      message: config.errorCode.status500.message 
      }) 
     } 
     if (!user) { 
      logger.error('Friend 404 User does not exist.') 
      return res.status(404).json({ 
      code: config.errorCode.status404.code, 
      message: config.errorCode.status404.message 
      }) 
     }else { 
      if (!user.friends) { 
      logger.error('Friend 404 User friends do not exist.') 
      return res.status(404).json({ 
       code: config.errorCode.status404.code, 
       message: config.errorCode.status404.message 
      }) 
      } 
      return res.json({ 
      receivedFriendRequests: user.receivedFriendRequests.slice(0, 5), 
      data: user.friends 
      }) 
     } 
     }) 

用戶模式:

var UserSchema = new Schema({ 
    firstName: { 
    type: String 
    }, 
    frstNameNormalized: { 
    type: String 
    }, 
    lastName: { 
    type: String 
    }, 
    lastNameNormalized: { 
    type: String 
    }, 
    email: { 
    type: String, 
    // unique: true, 
    // required: true, 
    lowercase: true, 
    // match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'Please enter a valid email address'] 
    }, 
    birthDate: { 
    type: Date 
    }, 
    facebookID: { 
    type: String 
    }, 
    twitterID: { 
    type: String 
    }, 
    password: { 
    type: String 
    }, 
    nickname: { 
    type: String, 
    default: '' 
    }, 
    description: { 
    type: String, 
    default: '' 
    }, 
    avatarPath: { 
    type: String, 
    default: '' 
    }, 
    friends: [{ type: Schema.Types.ObjectId, ref: 'User' }], 
    receivedFriendRequests: [{ type: Schema.Types.ObjectId, ref: 'User' }], 
    sentFriendRequests: [{ type: Schema.Types.ObjectId, ref: 'User' }], 
    sharedFriendCheckIns: [{ type: Schema.Types.ObjectId, ref: 'User' }], 
    resetPasswordToken: String, 
    resetPasswordExpires: Date, 
    emailConfirmToken: String, 
    emailConfirmExpires: Date, 
    emailConfirmed: { 
    type: Boolean, 
    default: false 
    } 
}) 
.... 

UserSchema.index({ firstName: 'text', lastName: 'text', email: 'text'}) 

var User = module.exports = mongoose.model('User', UserSchema) 

我做錯了什麼或者有什麼方法可以執行所有5種情況?

+0

您是否找到了解決方案? –

回答

0

剛剛嘗試並使用此代碼,我已經取代了正則表達式與$文字

User.findOne({ _id: req.user.id }) 
       .populate({ 
       path: 'friends', 
       select: 'firstName lastName email avatarPath facebookID', 
       match: 
        { $text: { $search: req.query.keyWord } } 
       }) 
       .populate({ 
       path: 'receivedFriendRequests', 
       select: 'firstName lastName email avatarPath facebookID', 
       match: { 
        $text: { $search: req.query.keyWord } 
       } 
       }) 
       .exec(function (err, user) { 
       if (err) { 
        logger.error('Friend 500 ' + err) 
        return res.status(500).json({ 
        code: config.errorCode.status500.code, 
        message: config.errorCode.status500.message 
        }) 
       } 
       if (!user) { 
        logger.error('Friend 404 User does not exist.') 
        return res.status(404).json({ 
        code: config.errorCode.status404.code, 
        message: config.errorCode.status404.message 
        }) 
       }else { 
        if (!user.friends) { 
        logger.error('Friend 404 User friends do not exist.') 
        return res.status(404).json({ 
         code: config.errorCode.status404.code, 
         message: config.errorCode.status404.message 
        }) 
        } 
        return res.json({ 
        receivedFriendRequests: user.receivedFriendRequests.slice(0, 5), 
        data: user.friends 
        }) 
       } 
       }) 
+0

我已經試過這種方式,它不適用於案例1和案例3,您可以在我的第一個代碼塊中看到它,但無論如何要感謝。 – andzaOs

0

萬一有人需要它,我已經解決了這個問題。因爲我是初學者,所以解決方案很簡單,可能不是最優的,但它確實應該做到。

FriendController.route('/').get(passport.authenticate('jwt', { session: false }), function (req, res) { 

var parts = (req.query.keyWord).split(' ') 
var firstName = '' 
var lastName = '' 

if (parts.length > 1) { 

    firstName = (req.query.keyWord).split(' ').slice(0, -1).join(' ') 
    lastName = (req.query.keyWord).split(' ').slice(-1).join(' ') 

} else { 

    firstName = req.query.keyWord 
    lastName = req.query.keyWord 

} 

User.find({ 
    $and: [ 
    { 
     $or: [ 
     { 
      firstName: { $regex: firstName, $options: 'i'} 
     }, 
     { 
      lastName: { $regex: lastName, $options: 'i'} 
     }, 
     { 
      email: req.query.keyWord 
     } 
     ] 
    }, 
    { 
     friends: req.user.id 
    } 
    ] 
}) 
    .select('firstName lastName email avatarPath facebookID') 
    .exec(function (err, friends) { 
    if (err) { 
     logger.error('Friend 500 ' + err) 
     return res.status(500).json({ 
     code: config.errorCode.status500.code, 
     message: config.errorCode.status500.message 
     }) 
    } 
    User.find({ 
     $and: [ 
     { 
      $or: [ 
      { 
       firstName: { $regex: firstName, $options: 'i'} 
      }, 
      { 
       lastName: { $regex: lastName, $options: 'i'} 
      }, 
      { 
       email: req.query.keyWord 
      } 
      ] 
     }, 
     { 
      sentFriendRequests: req.user.id 
     } 
     ] 
    }) 
     .select('firstName lastName email avatarPath facebookID') 
     .exec(function (err, friendRequests) { 
     if (err) { 
      logger.error('Friend 500 ' + err) 
      return res.status(500).json({ 
      code: config.errorCode.status500.code, 
      message: config.errorCode.status500.message 
      }) 
     } 
     return res.json({ 
      receivedFriendRequests: friendRequests, 
      data: friends 
     }) 
     }) 
    }) 
})