programing

몽구스.js: 사용자 이름 LIKE 값으로 사용자 검색

padding 2023. 4. 3. 21:19
반응형

몽구스.js: 사용자 이름 LIKE 값으로 사용자 검색

value라는 사용자를 찾아서 mongoDb에 있는 사용자를 찾고 싶습니다.문제:

username: 'peter'

사용자 이름이 "Peter" 또는 "PTER"이면 찾을 수 없습니다.아니면 그런 비슷한 것.

그래서 sql처럼 하고 싶다.

SELECT * FROM users WHERE username LIKE 'peter'

내가 부탁한 걸 받았으면 좋겠어?

요약: mongoose.js/mongodb의 'field LIKE 값'

솔루션을 찾고 계신 고객님께는 다음과 같습니다.

var name = 'Peter';
model.findOne({name: new RegExp('^'+name+'$', "i")}, function(err, doc) {
  //Do your action here..
});

최근에 문제가 있어서 이 코드를 사용하고 있습니다.

var data = 'Peter';

db.User.find({'name' : new RegExp(data, 'i')}, function(err, docs){
    cb(docs);
});

직접 사용/Peter/i일하지만, 나는 사용한다'/'+data+'/i'날 위해 일하는 게 아니라

db.users.find( { 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } } )
collection.findOne({
    username: /peter/i
}, function (err, user) {
    assert(/peter/i.test(user.username))
})
router.route('/product/name/:name')
.get(function(req, res) {

    var regex = new RegExp(req.params.name, "i")
    ,   query = { description: regex };

    Product.find(query, function(err, products) {
        if (err) {
            res.json(err);
        }

        res.json(products);
    });

});  

당신은 그것을 위해 정규식을 사용해야 합니다.

db.users.find({name: /peter/i});

그러나 이 쿼리는 인덱스를 사용하지 않습니다.

다음 쿼리는 필요한 문자열 대소문자를 구분하지 않고 글로벌하게 발생한 문서를 찾습니다.

var name = 'Peter';
    db.User.find({name:{
                         $regex: new RegExp(name, "ig")
                     }
                },function(err, doc) {
                                     //Your code here...
              });

이게 내가 쓰고 있는 거야.

module.exports.getBookByName = function(name,callback){
    var query = {
            name: {$regex : name}
    }
    User.find(query,callback);
}

mongoose doc는 find, mongodb doc는 regex.

var Person = mongoose.model('Person', yourSchema);
// find each person with a name contains 'Ghost'
Person.findOne({ "name" : { $regex: /Ghost/, $options: 'i' } },
    function (err, person) {
             if (err) return handleError(err);
             console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation);
});

전달되는 첫 번째 인수에 주의해 주세요.mongoose.findOne기능:{ "name" : { $regex: /Ghost/, $options: 'i' } },"name"검색 중인 문서의 필드입니다."Ghost"정규 표현입니다."i"대소문자를 구분하지 않는 일치입니다.이게 도움이 되길 바라.

여기 express 코드JS:

router.route('/wordslike/:word')
    .get(function(request, response) {
            var word = request.params.word;       
            Word.find({'sentence' : new RegExp(word, 'i')}, function(err, words){
               if (err) {response.send(err);}
               response.json(words);
            });
         });

@PeterBechP의 답변을 보완합니다.

특별 문자 스케이프하는 거 잊지 마세요. https://stackoverflow.com/a/6969486

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

var name = 'Peter+with+special+chars';

model.findOne({name: new RegExp('^'+escapeRegExp(name)+'$', "i")}, function(err, doc) {
  //Do your action here..
});

동적 검색의 경우, 다음과 같이 팔로우 할 수 있습니다.

const { keyword, skip, limit, sort } = pagination(params);
const search = keyword
      ? {
          title: {
            $regex: new RegExp(keyword, 'i')
          }
        }
      : {};

Model.find(search)
      .sort(sort)
      .skip(skip)
      .limit(limit);

특정 조건에서 모든 레코드를 쿼리하는 경우 다음을 사용할 수 있습니다.

if (userId == 'admin')
  userId = {'$regex': '.*.*'};
User.where('status', 1).where('creator', userId);

이것은 요구량의 모든 을 mongoose LIKE 파라미터로 변환하기 위한 솔루션입니다.

let superQ = {}

Object.entries({...req.body}).map((val, i, arr) => {
    superQ[val[0]] = { '$regex': val[1], '$options': 'i' }
})

User.find(superQ)
  .then(result => {
    res.send(result)})
  .catch(err => { 
    res.status(404).send({ msg: err }) })
var name = 'Peter';

model.findOne({
  name: {
    $regex: name,
    $options: 'i'
  }, 
  function(err, doc) {
  //your logic
});

상세한 것에 대하여는, 다음의 링크를 참조해 주세요.https://www.mongodb.com/docs/manual/reference/operator/query/regex/

언급URL : https://stackoverflow.com/questions/9824010/mongoose-js-find-user-by-username-like-value

반응형