আমি মংডোব-এ কীভাবে সংবেদনশীল জিজ্ঞাসা করব?


93
var thename = 'Andrew';
db.collection.find({'name':thename});

আমি কীভাবে সংবেদনশীলকে জিজ্ঞাসা করব? "অ্যান্ড্রু" হলেও ফলাফল খুঁজে পেতে চাই;



প্রত্যেকের কাছে যারা একটি রেগেক্সগুলি জড়িত একটি উত্তর ব্যবহার করার চেষ্টা করবেন তাদের একটি নোট: রেজেক্সেসকে স্যানিটাইজ করা দরকার।
শান

উত্তর:


126

ক্রিস ফুলস্টোর সমাধান (+1) কাজ করবে, তবে এটি দক্ষ নাও হতে পারে, বিশেষত যদি আপনার সংগ্রহটি খুব বড় হয়। মূলবিহীন নিয়মিত অভিব্যক্তি ( ^যা শুরু হয় না , যা স্ট্রিংয়ের শুরুতে নিয়মিত প্রকাশকে অ্যাঙ্কর করে) এবং যারা iসংবেদনশীলতার জন্য পতাকা ব্যবহার করে তারা উপস্থিত থাকলেও সূচকগুলি ব্যবহার করবে না।

একটি বিকল্প বিকল্পটি বিবেচনা করতে পারেন একটি ছোট হাতের সংস্করণ সংরক্ষণ করতে আপনার ডেটা denormalize হয় nameযেমন উদাহরণস্বরূপ, ক্ষেত্র name_lower। তারপরে আপনি কেস-সংবেদনশীল নির্ভুল ম্যাচের জন্য দক্ষতার সাথে (বিশেষত এটি সূচকযুক্ত হলে) কোয়েরি করতে পারেন:

db.collection.find({"name_lower": thename.toLowerCase()})

বা উপসর্গের ম্যাচ (মূলের নিয়মিত অভিব্যক্তি) এর সাথে:

db.collection.find( {"name_lower":
    { $regex: new RegExp("^" + thename.toLowerCase(), "i") } }
);

এই উভয় প্রশ্নেরই একটি সূচক ব্যবহার করবে name_lower


4
দুর্দান্ত উত্তর, একবার কয়েক মিলিয়ন ডক্স স্ক্যান করার পরে আমার রেজেক্স পদ্ধতিটি সত্যিই ধীর হয়ে যায়।
ক্রিস ফুলস্টো

34
এটি আসলে পুরোপুরি সঠিক নয়, কারণ "অ্যান্ড্রু" সন্ধানের সময় আপনি "অ্যান্ড্রু কিছু" পেতে পারেন। সুতরাং রেগেক্সকে এডজাস্ট করুন: new RegExp('^'+ username + '$', "i")একটি সঠিক মিল হতে match
ট্যারিওন

9
মঙ্গোডিবি ওয়েবসাইট অনুসারে যে কোনও ক্ষেত্রে সংবেদনশীল রেজেক্স সূচক দক্ষ নয় "" রেগেক্স কেবল তখনই কার্যকরভাবে একটি সূচক ব্যবহার করতে পারে যখন নিয়মিত এক্সপ্রেশনটি স্ট্রিংয়ের শুরুতে (যেমন ^) অ্যাঙ্কর থাকে এবং কেস-সংবেদনশীল ম্যাচ হয় "
রায়ান শুমাচার

4
মঙ্গুজের সাথে এটি আমার জন্য কাজ করেছে: ইউজার.ফাইন্ড ({'ব্যবহারকারীর নাম': {ge রেজেেক্স: নতুন রেজিপ্যাক্স ('^' + ব্যবহারকারীর নাম .লোটারকেস (), 'আই')} function, ফাংশন (ত্রুটি, পুনরায়)) যদি (ভুল) ) নিক্ষেপ ত্রুটি; পরের (নাল, পুনরায়);});
ক্রিসরিচ

4
নিয়মিত প্রকাশের সাথে কাজ করার সময় নামটি এড়াতে ভুলবেন না। আমরা চাই না যে ইনজেকশনগুলি মঙ্গোদবটির সৌন্দর্য গ্রহণ করবে। আপনি কেবল লগইন পৃষ্ঠার জন্য এই কোডটি ব্যবহার করেছিলেন এবং ব্যবহারকারীর নামটি কল্পনা করুন ".*"
টোবিয়াস

90

আপনার এটির জন্য কেস-সংবেদনশীল নিয়মিত ভাব প্রকাশ করা দরকার, যেমন

db.collection.find( { "name" : { $regex : /Andrew/i } } );

আপনার thenameভেরিয়েবল থেকে রেজেক্স প্যাটার্নটি ব্যবহার করতে একটি নতুন রেজিএক্সপেক্ট অবজেক্ট তৈরি করুন:

var thename = "Andrew";
db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } );

আপডেট: সঠিক মিলের জন্য, আপনার পুনরায় ব্যবহার করতে হবে "name": /^Andrew$/i। ইয়্যানিক এলকে ধন্যবাদ


7
আপনি কি জানেন যে নোড.জেএস মঙ্গুজ ব্যবহার করে এটি করবেন?
ব্যবহারকারী 847495

4
আমি ভাবছি যে এটি বড় সংগ্রহের সাথে কতটা ভাল কাজ করবে। আপনি একটি বাছাই করা ফ্যাক্টিনননের সুবিধাটি ছেড়ে দিয়ে যাবেন
উইলফ্রেড স্প্রিংগার

4
এটি ভুল, এটি কেবল " সমান " নয়, এর জন্য "অ্যান্ড্রু" ধারণকারী যে কোনও নথির সাথে মিলবে will name
জোনাথন ক্রেমিন

14
আপনার সঠিক উত্তরটি পোস্ট করা উচিত এমন লোকদের @ জোনাথনক্রিমিন সাহায্য করার জন্য:{ "name": /^Andrew$/i }
ইয়ানিক লরিওট

@ ইয়ানিকল সাধারণ জ্ঞানের কাজটি করার জন্য 1+। আমি কেবল যা যাচ্ছিলাম তা দিয়েই যাচ্ছিলাম না।
Lpc_dark

38

আমি এটি এর মতো সমাধান করেছি।

 var thename = 'Andrew';
 db.collection.find({'name': {'$regex': thename,$options:'i'}});

আপনি যদি 'কেস-সংবেদনশীল হুবহু মিল' সম্পর্কিত প্রশ্নটি করতে চান তবে আপনি এটি যেতে পারেন।

var thename =  '^Andrew$';
db.collection.find({'name': {'$regex': thename,$options:'i'}});

7

মঙ্গোডিবি ৩.৪-এ এখন একটি সত্যিকারের কেস-সংবেদনশীল সূচক তৈরি করার ক্ষমতা অন্তর্ভুক্ত রয়েছে, যা বড় ডেটাসেটগুলিতে সংক্ষিপ্ত আকারের কেস সংবেদনশীল অনুসন্ধানের গতি বাড়িয়ে তুলবে। এটি 2 এর শক্তির সাথে একটি কোলেশন নির্দিষ্ট করে তৈরি করা হয়।

সম্ভবত এটির সবচেয়ে সহজ উপায় হ'ল ডেটাবেজে একটি কোলেশন সেট করা। তারপরে সমস্ত প্রশ্নগুলি সেই জোটের উত্তরাধিকারী এবং এটি ব্যবহার করবে:

db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } )
db.names.createIndex( { city: 1 } ) // inherits the default collation

আপনি এটি এর মতো করেও করতে পারেন:

db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}});

এবং এটি এর মতো ব্যবহার করুন:

db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2});

এটি "নিউ ইয়র্ক", "নিউ ইয়র্ক", "নিউ ইয়র্ক", ইত্যাদি নামের শহরগুলি ফিরিয়ে দেবে

আরও তথ্যের জন্য: https://jira.mongodb.org/browse/SERVER-90


শক্তি: 1 কেস-সংবেদনশীল, ডায়াক্রিটিক-সংবেদনশীল সূচক জন্য যথেষ্ট। docs.mongodb.com/manual/references/collation
গৌরব রাগতাহ

7
  1. মঙ্গুজ (এবং নোড) এর সাথে, এটি কাজ করেছে:

    • User.find({ email: /^name@company.com$/i })

    • User.find({ email: new RegExp(`^ $ {ইমেল পরিবর্তনশীল} $`, 'আমি')})

  2. মঙ্গোডিবিতে, এটি কাজ করেছে:

    • db.users.find({ email: { $regex: /^name@company.com$/i }})

দুটি লাইনই কেস-সংবেদনশীল। ডিবিতে ইমেলটি হতে পারে NaMe@CompanY.Comএবং উভয় লাইনই ডিবিতে অবজেক্টটি আবিষ্কার করবে।

তেমনি, আমরা ব্যবহার করতে পারি /^NaMe@CompanY.Com$/iএবং এটি এখনও ইমেল খুঁজে পেতে পারে : name@company.comডিবিতে।


5

সংবেদনশীল স্ট্রিংটি কেসটি সন্ধান করতে এটি ব্যবহার করুন,

var thename = "Andrew";
db.collection.find({"name":/^thename$/i})

4
কেন তুমি সদৃশ উত্তর যোগ করা হয় যেমন ইতিমধ্যে সেখানে রয়েছে stackoverflow.com/a/7101868/4273915
Shrabanee

4

আমি কয়েক ঘন্টা আগে এই সমস্যাটি সমাধান করেছি।

var thename = 'Andrew'
db.collection.find({ $text: { $search: thename } });
  • কেস সংবেদনশীলতা এবং ডায়াক্রিটিক সংবেদনশীলতা এইভাবে কোয়েরি করার সময় ডিফল্টরূপে মিথ্যাতে সেট করা হয়।

এমনকি এন্ড্রুয়ের ব্যবহারকারীর অবজেক্ট থেকে আপনার প্রয়োজনীয় ক্ষেত্রগুলি নির্বাচন করে এটির মাধ্যমে এটি প্রসারিত করতে পারেন:

db.collection.find({ $text: { $search: thename } }).select('age height weight');

তথ্যসূত্র: https://docs.mongodb.org/manual/references/operator/query/text/#text


4
$ পাঠ্য পাঠ্য সূচীর সাথে সূচিত ক্ষেত্রগুলির সামগ্রীতে একটি পাঠ্য অনুসন্ধান সম্পাদন করে।
এসএসএইচ এই

4

... নোডজেএস-তে মঙ্গুসের সাথে এই ক্যোয়ারী:

const countryName = req.params.country;

{ 'country': new RegExp(`^${countryName}$`, 'i') };

বা

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

// ^australia$

বা

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };

// ^turkey$

জাভাস্ক্রিপ্টে একটি পূর্ণ কোড উদাহরণ, মঙ্গোডিবিতে মঙ্গুজ ওআরএম সহ নোডজেএস

// get all customers that given country name
app.get('/customers/country/:countryName', (req, res) => {
    //res.send(`Got a GET request at /customer/country/${req.params.countryName}`);

    const countryName = req.params.countryName;

    // using Regular Expression (case intensitive and equal): ^australia$

    // const query = { 'country': new RegExp(`^${countryName}$`, 'i') };
    // const query = { 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };
    const query = { 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

    Customer.find(query).sort({ name: 'asc' })
        .then(customers => {
            res.json(customers);
        })
        .catch(error => {
            // error..
            res.send(error.message);
        });
});

1

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

db.collection.find({name:{
                             $regex: new RegExp(thename, "ig")
                         }
                    },function(err, doc) {
                                         //Your code here...
                  });

1

কেস-সংবেদনশীল আক্ষরিক স্ট্রিংটি খুঁজতে:

রিজেক্স ব্যবহার করা (প্রস্তাবিত)

db.collection.find({
    name: {
        $regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')
    }
});

লোয়ার-কেস সূচক ব্যবহার করা (দ্রুত)

db.collection.find({
    name_lower: name.toLowerCase()
});

আক্ষরিক স্ট্রিং মিলের চেয়ে নিয়মিত প্রকাশগুলি ধীর হয়। তবে একটি অতিরিক্ত ছোট ছোট ক্ষেত্র আপনার কোডের জটিলতা বাড়িয়ে তুলবে। সন্দেহ হলে নিয়মিত ভাব প্রকাশ করুন। আমি কেবলমাত্র একটি স্পষ্টত লোয়ার-কেস ফিল্ড ব্যবহার করার পরামর্শ দেব যদি এটি আপনার ক্ষেত্রটি প্রতিস্থাপন করতে পারে, তবে, আপনি প্রথমে কেসটির বিষয়ে চিন্তা করবেন না।

মনে রাখবেন যে রেজেেক্সের আগে আপনাকে নামটি পালাতে হবে। আপনি যদি ব্যবহারকারী-ইনপুট ওয়াইল্ডকার্ডগুলি চান, তবে .replace(/%/g, '.*')পালানোর পরে সংযোজন পছন্দ করুন যাতে 'a' দিয়ে শুরু হওয়া সমস্ত নাম খুঁজে পেতে আপনি "%" এর সাথে মিল রাখতে পারেন।


1

আপনি কেস সংবেদনশীল সূচকগুলি ব্যবহার করতে পারেন :

নিম্নোক্ত উদাহরণটি কোনও ডিফল্ট কোলেশন ছাড়াই একটি সংগ্রহ তৈরি করে, তারপরে কেস সংবেদনশীল কোলেশন সহ নামের ক্ষেত্রে একটি সূচক যুক্ত করে। ইউনিকোডের জন্য আন্তর্জাতিক উপাদানসমূহ

/*
* strength: CollationStrength.Secondary
* Secondary level of comparison. Collation performs comparisons up to secondary * differences, such as diacritics. That is, collation performs comparisons of 
* base characters (primary differences) and diacritics (secondary differences). * Differences between base characters takes precedence over secondary 
* differences.
*/
db.users.createIndex( { name: 1 }, collation: { locale: 'tr', strength: 2 } } )

সূচকটি ব্যবহার করতে, ক্যোয়ারিকে অবশ্যই একই সমষ্টি নির্দিষ্ট করতে হবে।

db.users.insert( [ { name: "Oğuz" },
                            { name: "oğuz" },
                            { name: "OĞUZ" } ] )

// does not use index, finds one result
db.users.find( { name: "oğuz" } )

// uses the index, finds three results
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 2 } )

// does not use the index, finds three results (different strength)
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 1 } )

অথবা আপনি ডিফল্ট কোলেশন সহ একটি সংগ্রহ তৈরি করতে পারেন:

db.createCollection("users", { collation: { locale: 'tr', strength: 2 } } )
db.users.createIndex( { name : 1 } ) // inherits the default collation

-3

নীচের মতো $ টু লোয়ার ব্যবহার করার একটি সহজ উপায় হবে।

db.users.aggregate([
    {
        $project: {
            name: { $toLower: "$name" }
        }
    },
    {
        $match: {
            name: the_name_to_search
        }
    }
])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.