মঙ্গুজ.জেএস: ব্যবহারকারীর নাম অনুসারে ব্যবহারকারীর সন্ধান করুন


95

আমি মানুগ নামের একটি ব্যবহারকারীকে অনুসন্ধান করে মঙ্গোডিবিতে কোনও ব্যবহারকারীকে যেতে চাই। সমস্যা:

username: 'peter'

ইউজার নেমটি যদি "পিটার" বা "পিটার" হয় বা এটির মতো কিছু হয় তবে আমি এটি খুঁজে পাব না।

সুতরাং আমি এসকিএল এর মত করতে চাই

SELECT * FROM users WHERE username LIKE 'peter'

আশা করি ছেলেরা কি চাইবে?

সংক্ষিপ্ত: mongoose.js / mongodb এ 'ক্ষেত্রের মতো মান'


4
কেবল একপাশে, এসকিউএল কোয়েরিটি আবিষ্কার করবে না Peterবা PeTERহয় LIKEতা সংবেদনশীল নয়।
beny23

উত্তর:


147

তাদের জন্য যারা এখানে সমাধান খুঁজছিলেন তারা হলেন:

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

4
"আমি" যুক্তি বলতে কী বোঝায়? কেসের সংবেদনশীলতার সাথে এর কোনও যোগসূত্র রয়েছে?
AzaFromKaza

4
"আমি" অনুসন্ধানের পতাকাটি বেছে নেওয়ার পক্ষে যুক্তি। "আমি" তখন কেস-সংবেদনশীলদের জন্য। আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

10
এটি ধরে নিয়েছে রেজেক্সটি অবৈধ নয়। উদাহরণস্বরূপ আপনি যদি "[" ব্যবহারকারীর নাম হিসাবে যুক্ত হন তবে ব্যতিক্রম ছুঁড়ে দেবেন। আপনি নিশ্চিত হয়ে নিন যে আপনি প্রথমে আপনার ইনপুটটিকে ধরে ফেলতে বা পুনরায় জাজীকরণ করছেন এবং [^ a-zA-Z0-9] এর জন্য পরীক্ষা করছেন তারপরে আর না এগিয়ে যাচ্ছেন। এই ক্ষেত্রে, এটি ঠিক পরীক্ষা ইনপুট তাই বোধগম্য।
জেসন সেব্রিং

4
$ = স্ট্রিংয়ের শেষের সাথে ম্যাচ করুন
পিটারবেচপি

4
@ জেসনসেব্রিং যদিও আমি সম্মত হই যে ইনপুট বৈধতা কোনও খারাপ ধারণা নয়, তবে সর্বোত্তম পন্থা হ'ল আসল পালনের অ্যালগরিদম। এবং ব্যতিক্রমগুলি এমনকি সবচেয়ে খারাপ সমস্যাও নয়, তবে কল্পনা করুন যে আপনি লগইন পৃষ্ঠায় অনুরূপ কোড ব্যবহার করেছেন এবং ব্যবহারকারী ".*"হিসাবে ব্যবহারকারী হিসাবে প্রবেশ করেছেন।
টোবিয়াস

78

সম্প্রতি এটি নিয়ে আমার সমস্যা হয়েছিল, আমি এই কোডটি ব্যবহার করি এবং আমার পক্ষে ভাল কাজ করি।

var data = 'Peter';

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

সরাসরি /Peter/iকাজ ব্যবহার করুন , তবে আমি ব্যবহার করি '/'+data+'/i'এবং আমার পক্ষে কাজ করে না।


ঠিক আছে, আমি এটি আরও কিছু চেষ্টা করেছি। আমি এটিও দেখতে পাচ্ছি যে আমি কেবল পি লিখি কিনা? হুমমম।
পিটারবেকপ

হ্যাঁ, আমি ব্যবহারকারীদের অনুসন্ধান করতে আজাক্স পিটিশনগুলির জন্য ব্যবহার করি। আপনি RegExp পরিবর্তন করতে পারেন।
ডনফ্লোপেজ

37
db.users.find( { 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } } )

@ মাইকশি এটির উদাহরণ উদাহরণ কী?
লেন জোসেফ

@ লেন জোসেফ কেবল সাধারণভাবে রেডোস আক্রমণ: owasp.org/index.php/… , আমি জানি না যদি মংগুজ এই মুহুর্তে দুর্বল হয়, বা যদি রেডোএস ইনপুটগুলি সনাক্ত করতে এবং মঙ্গস স্তরে স্যানিটাইজ করার জন্য কোনও উদ্দেশ্যমূলক কার্যকারিতা রয়েছে।
মাইক শি

14
collection.findOne({
    username: /peter/i
}, function (err, user) {
    assert(/peter/i.test(user.username))
})

যদি মানটি একটি ভ্যার হয়? কিভাবে সেট আপ? / ভেরে / আই?
পিটারবেকপ

4
@ পিটারবেচপি একটি নিয়মিত অভিব্যক্তি তৈরি করুন: new RegExp(var, "i")
Ray

ভাল কাজ করে .. এখন আমার একটা সমস্যা হয়েছে .. ভেরি পিটার হলে এটি কেবল পিটারটি সন্ধান করতে হবে। তবে আমি যদি ভারটি 'পি' তে সেট করি তবে এটি এখনও পিটার খুঁজে পাবে।
পিটারবেকপ

@ পিটারবেচপি তারপরে মামলাটি সংবেদনশীলতা পতাকাটি সরিয়ে ফেলুন:
Ray

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

});  

13

আপনার এটির জন্য একটি রেজেেক্স ব্যবহার করা উচিত।

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

সতর্ক থাকুন, যদিও এই কোয়েরিটি সূচকটি ব্যবহার করে না।


9

মঙ্গুজ ডক সন্ধানের জন্য। রেগেক্সের জন্য মঙ্গডব ডক

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"ক্ষেত্রে অসংবেদী ম্যাচের জন্য নয়। আশা করি এটা তোমাকে সাহায্য করবে।


$ বিকল্পগুলি কী
কবুতু 178

8

নিম্নলিখিত ক্যোয়ারী সংবেদনশীলভাবে এবং বিশ্বব্যাপী উপস্থিতি সহ প্রয়োজনীয় স্ট্রিং কেস সহ নথিগুলি সন্ধান করবে

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

6

এটিই আমি ব্যবহার করছি।

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

5

এক্সপ্রেসজেএস সহ এখানে আমার কোড:

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

1

যদি আমি কিছু শর্তে সমস্ত রেকর্ড জিজ্ঞাসা করতে চাই , আমি এটি ব্যবহার করতে পারি:

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

$regexআপনি যখন সবেমাত্র ব্যবহার করতে পারতেন তার অপ্রয়োজনীয় ব্যবহারের মতো মনে হয় { $exists: true }
শন

0

কেবলমাত্র @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..
});

0

এই রূপান্তরের জন্য আমার সমাধান যে মান একটি req.body একটি নকুল করার মত PARAM:

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 }) })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.