2017-03-15 2 views
0

Unten finden Sie meinen Code, wo ich versuche, Felder (Vorname, Nachname und E-Mail) in Mongoose nach einem Schlüsselwort zu suchen. Leider funktioniert es nicht wie erwartet. Es ist nur Renditen führen, wenn die volle Vor- oder Nachnamen eingegeben wird, aber ich möchte in allen Fällen erhalten führen:Suche nach Vorname, Nachname und E-Mail nach einem Schlüsselwort in Mongoose

Beispiel:

Benutzer Vor- und Nachname = John Smith

  1. Fall: keyword = Jo
  2. Fall: keyword = John
  3. Fall: keyword = John Sm
  4. Fall: keyword = John Smith
  5. Fall: keyword = [email protected]

-Code, die Textindizes für Vornamen, Nachnamen und E-Mail verwendet:

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 
      }) 
     } 
     }) 

ich auch auf diese Weise versucht, aber es auch nicht funktioniert für Alle 5 Fälle:

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 
      }) 
     } 
     }) 

Benutzer Schema:

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) 

Mache ich etwas falsch oder gibt es eine Möglichkeit, alle 5 Fälle zu implementieren?

+0

Haben Sie irgendwelche Lösungen dafür gefunden? –

Antwort

0

Versuchen Sie einfach, und diesen Code verwende ich Regex mit $ text

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

Ich habe es bereits versucht und es funktioniert nicht für Fall 1 und Fall 3, Sie können es in meinem ersten Codeblock sehen, aber trotzdem danke. – andzaOs

0

Bei ersetzt haben, dass jemand es braucht, habe ich dieses Problem gelöst. Da ich ein Anfänger bin, ist die Lösung trivial und wahrscheinlich nicht optimal, aber sie tut, was sie sollte.

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 
     }) 
     }) 
    }) 
}) 
Verwandte Themen