মঙ্গোডিবি: কেস-সংবেদনশীল কোয়েরি করা সম্ভব?


304

উদাহরণ:

> db.stuff.save({"foo":"bar"});

> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0

3
মোংগোডিবি ৩.২ থেকে আপনি কেস-সংবেদনশীল অনুসন্ধান চালিয়ে যেতে পারেন $caseSensitive: false। দেখুন: ডকস.মোংডব.অর্গ
মার্টিন

4
মনে রাখবেন যে এটি কেবল পাঠ্য সূচীতে রয়েছে।
উইলিয়াম ডি'হেসিলির

1
@ মার্টিন: $caseSensitiveডিফল্ট হিসাবে ইতিমধ্যে মিথ্যা, এবং এটি প্রশ্নের উত্তর দেয় না, কারণ এটি কেবল সূচিকৃত ক্ষেত্রগুলিতে কাজ করে। ওপি কেস-সংবেদনশীল স্ট্রিং তুলনা খুঁজছিল।
ড্যান ড্যাসকলেসকু

উত্তর:


342

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

আপনার উদাহরণে এটি হবে:

db.stuff.find( { foo: /^bar$/i } );

আমি অবশ্যই বলব, আপনি প্রতিবার এটি খুঁজে পাওয়ার জন্য অতিরিক্ত খরচ ব্যয় না করে আপনি পথে চলার মানটিকে কেবলমাত্র ডাউনচেস (বা উপচে রাখা) করতে পারেন। স্পষ্টতই এই লোকজনের নাম এবং এই জাতীয় কাজ করে না, তবে সম্ভবত ব্যবহারের ক্ষেত্রে ট্যাগের মতো।


27
এটি পুরোপুরি কাজ করে। এটি পিএইচপি-তে কাজ করে পেয়েছেন:: সংগ্রহ-> সন্ধান করুন (অ্যারে ('কী' => নতুন মঙ্গোরেজেক্স ('/'.$ ভাল।' / I '))));
লুক ডেনিস

2
বিশেষত যদি আপনি কোনও স্ট্রিং ({foo: / # {x} / i}) ইন্টারপোল্ট করছেন যা এতে একটি প্রশ্ন চিহ্ন থাকতে পারে ..
পিটার এহরলিচ

17
^ এবং also এও ভুলে যাবেন না: মঙ্গোরেজেক্স ('/ ^'। প্রিগ_কোট ($ ভ্যাল)। '$ / I')
জুলিয়েন

20
নোট করুন যে এটি সূচি ব্যবহারের পরিবর্তে একটি ফুলস্ক্যান করবে।
মার্টিন কোনিসেক

12
তিনি শুরুতে অ্যাঙ্কর ব্যবহার করেন তবে এটি কোনও ফুলস্ক্যান করবে না, তাই জুলিয়েনের পরামর্শের গুরুত্ব।
প্যাক্স

198

হালনাগাদ:

আসল উত্তরটি এখন অপ্রচলিত। মংডব এখন অনেকগুলি বৈশিষ্ট্য সহ উন্নত পূর্ণ পাঠ সন্ধানে সমর্থন করে।

মূল উত্তর:

এটি লক্ষ করা উচিত যে রেজেক্সের ক্ষেত্রে সংবেদনশীল / i এর সাথে অনুসন্ধান করা মানে মঙ্গডব সূচী দ্বারা অনুসন্ধান করতে পারে না, তাই বড় ডেটাসেটের বিরুদ্ধে অনুসন্ধানগুলি দীর্ঘ সময় নিতে পারে।

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

বিকল্প হিসাবে, আপনি বড় হাতের অনুলিপি সঞ্চয় করতে পারেন এবং এর বিরুদ্ধে অনুসন্ধান করতে পারেন। উদাহরণস্বরূপ, আমার কাছে একটি ব্যবহারকারীর টেবিল রয়েছে যার একটি ব্যবহারকারীর নাম রয়েছে যা মিশ্র ক্ষেত্রে, তবে আইডিটি ব্যবহারকারীর নামটির একটি বড় কপি। এটি নিশ্চিত করে যে কেস-সেনসিটিভ ডুপ্লিকেশন অসম্ভব ("উভয়" ফু "এবং" ফু "থাকার অনুমতি নেই), এবং আমি ব্যবহারকারীর নামটির জন্য কেস-সংবেদনশীল অনুসন্ধান পেতে আইডি = ব্যবহারকারীর নাম।

যদি আপনার ক্ষেত্রটি বড় হয় যেমন মেসেজ বডি, ডুপ্লিকেট করা ডেটা সম্ভবত কোনও ভাল বিকল্প নয়। আমি বিশ্বাস করি যে অ্যাপাচি লুসিনের মতো এক্সট্রান্সিয়াস ইনডেক্সার ব্যবহার করা সেক্ষেত্রে সেরা বিকল্প।


1
@ ড্যান, কেবলমাত্র তথ্যের জন্য, সর্বশেষ মঙ্গোডিবিতে, "যদি ক্ষেত্রের জন্য কোনও সূচক উপস্থিত থাকে, তবে মঙ্গোডিবি সূচকের মানগুলির তুলনায় নিয়মিত প্রকাশের সাথে মেলে যা সংগ্রহের স্ক্যানের চেয়ে দ্রুততর হতে পারে।" - docs.mongodb.org/manual/reference/operator/query/regex/...
Sergiy Sokolenko

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

1
পাঠ্য সূচকের আরও একটি সীমাবদ্ধতা হ'ল আপনার কেবলমাত্র সংগ্রহের জন্য একাধিক (একাধিক কলাম) থাকতে পারে, তাই বিভিন্ন ক্ষেত্রে যদি আপনাকে বিভিন্ন ক্ষেত্রে অনুসন্ধানগুলি বিচ্ছিন্ন করতে হয় তবে এটি উপযুক্ত নয়।
পল গ্রিমশো

2
@ সার্জিইসোকোলেঙ্কো: দস্তাবেজগুলি এখন ( বিভাগের শেষ অনুচ্ছেদ ) বলেছেন: "কেস সংবেদনশীল নিয়মিত প্রকাশের প্রশ্নাবলী সাধারণত সূচকগুলি কার্যকরভাবে ব্যবহার করতে পারে না The রেজেক্স বাস্তবায়ন কোলেশন-সচেতন নয় এবং কেস-সংবেদনশীল সূচকগুলি ব্যবহার করতে অক্ষম।"
ড্যান ড্যাসকলেসকু

1
পূর্ণ পাঠ্য অনুসন্ধান ব্যবহার এই ক্ষেত্রে ভুল (এবং সম্ভাব্য হয় বিপজ্জনক , কারণ প্রশ্নটি কেস-অবশ ক্যোয়ারী, উপার্জন যেমন ছিল) username: 'bill'ম্যাচিং BILLবা Billএকটি পূর্ণ টেক্সট অনুসন্ধান ক্যোয়ারী, যা ম্যাচ হবে, না পক্ষপাতিত্ব শব্দ এর bill, যেমন Bills, billedইত্যাদি
ড্যান ড্যাসকালেস্কু

70

যদি আপনার কোনও ভেরিয়েবল থেকে রেজিপেক্স তৈরি করতে হয় তবে এটি করার এটি আরও ভাল উপায়: https://stackoverflow.com/a/10728069/309514

তারপরে আপনি এর মতো কিছু করতে পারেন:

var string = "SomeStringToFind";
var regex = new RegExp(["^", string, "$"].join(""), "i");
// Creates a regex of: /^SomeStringToFind$/i
db.stuff.find( { foo: regex } );

এটির সুবিধাটি আরও বেশি প্রোগ্রামেমেটিক হচ্ছে বা আপনি যদি এটিকে পুনরায় ব্যবহার করে থাকেন তবে সময়ের আগে এটি সংকলন করে আপনি পারফরম্যান্সের উত্সাহ পেতে পারেন।


1
new RegExp("^" + req.params.term.toLowerCase(), "i") এছাড়াও দুর্দান্ত কাজ করে
তাহির ইয়াসিন

2
আপনি বৃদ্ধি নিরাপত্তার জন্য স্ট্রিং পলায়নের বিবেচনা করা উচিত যদি পরিবর্তনশীল একটি অনুরোধ থেকে আসে: stackoverflow.com/a/50633536/5195127
davidivad

মঙ্গোডিবি 3.4 দিয়ে শুরু করে, কেস সংবেদনশীল
সূচকের

আমার অন্য গুগল অনুসন্ধান সংরক্ষণ করেছে !!
rehman_00001

64

আগের উদাহরণটি মনে রাখবেন:

db.stuff.find( { foo: /bar/i } );

ধারণকারী প্রত্যেক এন্ট্রি কারণ হবে বার কোয়েরি (bar1, barxyz, openbar) মেলে, এটি একটি প্রমাণীকরণ ফাংশন উপর একটি ব্যবহারকারী নাম অনুসন্ধানের জন্য খুব বিপজ্জনক হতে পারে ...

আপনার এটিকে উপযুক্ত অনুসন্ধানের বাক্যটি যথাযথ হিসাবে প্রয়োগ করে কেবল অনুসন্ধান শব্দের সাথে মিলিয়ে দেওয়ার দরকার হতে পারে:

db.stuff.find( { foo: /^bar$/i } );

নিয়মিত অভিব্যক্তিগুলিতে সিনট্যাক্স সহায়তার জন্য http://www.regular-expressions.info/ দেখুন


এই উত্তর একটি মন্তব্য মত দেখাচ্ছে।
ড্যান ড্যাসক্লেস্কু

62

মঙ্গোডিবি 3.4 দিয়ে শুরু করে, দ্রুত কেস-সংবেদনশীল অনুসন্ধানগুলি করার জন্য প্রস্তাবিত উপায় হ'ল কেস সংবেদনশীল সূচক ব্যবহার করা ।

দয়া করে এই কাজটি করার জন্য আমি একজন প্রতিষ্ঠাতাকে ব্যক্তিগতভাবে ইমেল করেছিলাম এবং তিনি তা ঘটিয়ে দিয়েছিলেন! এটি ২০০৯ সাল থেকে জিরার একটি সমস্যা ছিল এবং অনেকেই এই বৈশিষ্ট্যটির জন্য অনুরোধ করেছেন। এখানে কিভাবে এটা কাজ করে:

1 বা 2 এর শক্তির সাথে কোলেশন নির্দিষ্ট করে কেস-সংবেদনশীল সূচক তৈরি করা হয় আপনি কেস-সংবেদনশীল সূচকটি তৈরি করতে পারেন:

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

আপনি যখন সংগ্রহগুলি তৈরি করেন তখন আপনি একটি ডিফল্ট কোলেশনও নির্দিষ্ট করতে পারেন:

db.createCollection('cities', { collation: { locale: 'en', strength: 2 } } );

উভয় ক্ষেত্রেই, কেস-সংবেদনশীল সূচকটি ব্যবহার করার জন্য, আপনাকে findসূচী বা সংগ্রহ তৈরির সময় ব্যবহৃত অপারেশনে একই সমান্তরালকরণ নির্দিষ্ট করতে হবে :

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

এটি "নিউ ইয়র্ক", "নিউ ইয়র্ক", "নিউ ইয়র্ক" ইত্যাদি ফিরিয়ে দেবে

অন্যান্য নোট

  • পূর্ণ পাঠ্য অনুসন্ধান ব্যবহার করার পরামর্শ দেওয়া উত্তরগুলি এক্ষেত্রে ভুল (এবং সম্ভাব্য বিপজ্জনক )। প্রশ্নটি কেস-অবশ ক্যোয়ারী, যেমন উপার্জন সম্পর্কে ছিল username: 'bill'ম্যাচিং BILLবা Bill, না একটি পূর্ণ পাঠ্য অনুসন্ধান ক্যোয়ারী, যা ম্যাচ হবে পক্ষপাতিত্ব শব্দের billযেমন Bills, billedইত্যাদি
  • নিয়মিত এক্সপ্রেশন ব্যবহার করার পরামর্শ দেওয়া উত্তরগুলি ধীর, কারণ এমনকি সূচীগুলির সাথেও ডকুমেন্টেশনে বলা হয়েছে :

    "কেস সংবেদনশীল নিয়মিত প্রকাশের প্রশ্নগুলি সাধারণত সূচকগুলি কার্যকরভাবে ব্যবহার করতে পারে না The রেজেক্স বাস্তবায়ন কোলেশন-সচেতন নয় এবং কেস-সংবেদনশীল সূচকগুলি ব্যবহার করতে অক্ষম।"

    $regexউত্তরগুলি ব্যবহারকারীর ইনপুট ইঞ্জেকশনের ঝুঁকিও চালায় ।


একত্রিতকরণ পাইপলাইন সহ, আমার জন্য দুর্দান্ত কাজ করেছে।
মরিও

আমি মনে করি এটি সঠিক উত্তর, কারণ ডেটা পড়ার গতি গুরুত্বপূর্ণ
রেন্ডম্যাক্স

একবারে কোনও সংগ্রহ তৈরির পরে এটিতে ডিফল্ট কোলেশন যুক্ত করার কোনও উপায় আমি খুঁজে পাচ্ছি না। এটি করার কোনও উপায় আছে?
অবিশ্বাস্য

19
db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity

1
আপনার উত্তর কীভাবে উপযুক্ত এবং প্রশ্নকারী কোডে কী ভুল তা সম্পর্কে ওলেগভি.ভোলকভের অবশ্যই বর্ণনা থাকতে হবে।
পার্থ ত্রিবেদী

1
এই কোড-কেবলমাত্র উত্তরটি accepted বছর আগে পোস্ট করা স্বীকৃত উত্তরটিতে কিছু যুক্ত করে না।
ড্যান ড্যাসকলেসকু

19

টি এল; ডিআর

মোঙ্গোতে এটি করার সঠিক উপায়

RegExp ব্যবহার করবেন না

প্রাকৃতিক দিকে যান এবং মংডোব-এর ইনবিল্ট ইনডেক্সিং ব্যবহার করুন, অনুসন্ধান করুন

ধাপ 1 :

db.articles.insert(
   [
     { _id: 1, subject: "coffee", author: "xyz", views: 50 },
     { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
     { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
     { _id: 4, subject: "baking", author: "xyz", views: 100 },
     { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
     { _id: 6, subject: "Сырники", author: "jkl", views: 80 },
     { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
     { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
   ]
)

ধাপ ২ :

ইনডেক্সিং কোয়েরি ছাড়াই আপনি যে কোনও পাঠ্য ক্ষেত্রে সন্ধান করতে চান তা সূচী তৈরি করা দরকার , অত্যন্ত ধীর হবে

db.articles.createIndex( { subject: "text" } )

ধাপ 3 :

db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } )  //FOR SENSITIVITY
db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY

1
ভাল বিকল্প, তবে একটি রেইজেক্স বনাম একটি পাঠ্য সূচী ব্যবহার করার মতো "সঠিক" কিছুই নেই, এটি কেবল অন্য একটি বিকল্প। এটি ওপির ক্ষেত্রে ওভারকিল।
জনিএইচকে

2
রেগেক্স বাদে উল্লেখযোগ্যভাবে ধীর। ফুলটেক্সট অনুসন্ধানও ধীর, তবে ততটা ধীর নয়। দ্রুততম (তবে আরও স্ফীতিত) উপায়টি একটি পৃথক ক্ষেত্র হবে যা সর্বদা ছোট হাতের কাছে সেট করা থাকে।
টম মেটাম

4
পূর্ণ পাঠ্য অনুসন্ধান ব্যবহার এই ক্ষেত্রে ভুল (এবং সম্ভাব্য হয় বিপজ্জনক ,) কারণ প্রশ্নটি কেস-অবশ ক্যোয়ারী, উপার্জন যেমন ছিল username: 'bill'ম্যাচিং BILLবা Billএকটি পূর্ণ টেক্সট অনুসন্ধান ক্যোয়ারী, যা ম্যাচ হবে, না পক্ষপাতিত্ব শব্দ এরbill, যেমন Bills, billedইত্যাদি
ড্যান ড্যাসকালেস্কু

15
db.company_profile.find({ "companyName" : { "$regex" : "Nilesh" , "$options" : "i"}});

2
আপনি কি এই উত্তর পোস্ট করার আগে বিদ্যমান উত্তরগুলি তাকান? কোয়াড-ডুপ্লিকেট কোড-কেবলমাত্র উত্তরের পরিবর্তে, আপনি পূর্ববর্তী উত্তরের তুলনায় এটি কীভাবে কোনও মূল্যবোধ যুক্ত করে তা ব্যাখ্যা করতে চাইতে পারেন।
ড্যান ড্যাসকলেসকু

1
আমি কেবল যুক্ত করতে চাই যে এই উত্তরটি আমাকে একটি সমাধানে পেয়েছে। আমি একটি পিএইচপি ফ্রেমওয়ার্ক ব্যবহার করছি এবং এটি ওআরএম সিনট্যাক্সের সাথে ভালভাবে ফিট করে যখন অন্য সমাধানগুলি এখানে দেয় নি। $existing = Users::masterFind('all', ['conditions' => ['traits.0.email' => ['$regex' => "^$value$", '$options' => 'i']]]);
ডন আরজেসুট

9

মঙ্গো (বর্তমান সংস্করণ ২.০.০) সূচিযুক্ত ক্ষেত্রগুলির বিরুদ্ধে কেস-সংবেদনশীল অনুসন্ধানের অনুমতি দেয় না - তাদের ডকুমেন্টেশন দেখুন । অ-তালিকাভুক্ত ক্ষেত্রগুলির জন্য, অন্যান্য উত্তরে তালিকাভুক্ত রেজিক্সগুলি ভাল হওয়া উচিত।


19
কেবল এটি স্পষ্ট করার জন্য: ইনডেক্সড ফিল্ডগুলিতে কেস-সংবেদনশীল অনুসন্ধানগুলি অনুমোদিত , তারা কেবল সূচকটি ব্যবহার করবে না এবং ক্ষেত্রটি সূচকযুক্ত না হওয়ার মতো ধীর হবে।
heavi5ide

@ হ্যাভিআইপিড যেহেতু এই প্রশ্নটি সদৃশ চিহ্নিত করার জন্য ব্যবহার করা হচ্ছে আমি ভেবেছিলাম যে আমি স্পষ্ট করে বলব যে রেজিেক্সগুলি (ক্ষেত্রে সংবেদনশীল অনুসন্ধানের জন্য প্রয়োজনীয়) সূচকটি ব্যবহার করে, তবে তাদের অবশ্যই একটি পূর্ণ সূচী স্ক্যান করতে হবে। অন্য কথায় তারা দক্ষতার সাথে সূচকটি ব্যবহার করতে পারে না । ভাগ্যক্রমে ডকুমেন্টেশনটি ২০১১ সাল থেকে আপডেট করা হয়েছে তবে এখানেও লক্ষণীয় good
সামায়ায়ে

7

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

db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})

কেন? কোনও ব্যবহারকারী .*তার ব্যবহারকারীর নাম হিসাবে প্রবেশ করানোর কল্পনা করুন । এটি কোনও ব্যবহারকারীর পাসওয়ার্ড অনুমান করে একটি লগইন সক্ষম করে সমস্ত ব্যবহারকারীর সাথে মিলবে।


6

সর্বোত্তম পদ্ধতিটি আপনার পছন্দের ভাষাটিতে রয়েছে, যখন আপনার সামগ্রীর জন্য একটি মডেল মোড়ক তৈরি করার সময় আপনার সেভ () পদ্ধতিটি পুনরায় ক্ষেত্রগুলির একটি সেট দিয়ে পুনরাবৃত্তি করুন যা আপনি অনুসন্ধানও করতে পারবেন; ক্ষেত্রগুলির সেটে ছোট হাতের সমতল থাকা উচিত যা অনুসন্ধানের জন্য ব্যবহৃত হয়।

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

লোয়ার কেস ক্ষেত্রগুলি কী হতে পারে: মান অবজেক্ট স্টোর বা প্রিফিক্সড এলসি_এর সাথে কেবল ক্ষেত্রের নাম। আমি জিজ্ঞাসাটি সহজ করার জন্য দ্বিতীয়টি ব্যবহার করি (গভীর অবজেক্টের অনুসন্ধানগুলি মাঝে মাঝে বিভ্রান্ত হতে পারে)।

দ্রষ্টব্য: আপনি lc_ ক্ষেত্রগুলি সূচী করতে চান, প্রধান ক্ষেত্রগুলি সেগুলি ভিত্তিতে নয়।


দুর্দান্ত সমাধান তবে ভাগ্যক্রমে মঙ্গোডিবি 3.4 দিয়ে শুরু করে, কেস ইনসেসেটিভ ইনডেক্সগুলির জন্য স্থানীয় সমর্থন রয়েছে ।
ড্যান ড্যাসকলেসকু

6

মনে করুন আপনি "টেবিল" এ "কলাম" অনুসন্ধান করতে চান এবং আপনি কেস সংবেদনশীল অনুসন্ধান চান। সর্বোত্তম এবং কার্যকর উপায় নীচে হিসাবে;

//create empty JSON Object
mycolumn = {};

//check if column has valid value
if(column) {
    mycolumn.column = {$regex: new RegExp(column), $options: "i"};
}
Table.find(mycolumn);

উপরের কোডটি কেবল আপনার অনুসন্ধান মানকে রেজিএক্স হিসাবে যুক্ত করেছে এবং বিকল্প হিসাবে "i" সহ নির্ধারিত সংবেদনশীল মানদণ্ডের সাথে অনুসন্ধান করে।

শুভকামনা.


5

মঙ্গুজ ব্যবহার করে এটি আমার পক্ষে কাজ করেছে:

var find = function(username, next){
    User.find({'username': {$regex: new RegExp('^' + username, 'i')}}, function(err, res){
        if(err) throw err;
        next(null, res);
    });
}

8
.toLowerCase()যদি আপনি কেস-সংবেদনশীল পতাকাটির পতাকাটি নির্দিষ্ট করে থাকেন তবে কি তা অতিরিক্ত নয় i?
100 কে

হ্যাঁ তাই হয়। আপনার .toLowerCase () লাগবে না। আমি উত্তর থেকে এটি সরিয়েছি।
ক্রিসরিচ

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

ঠিক আছে এটি খুঁজে পেয়েছে, সঠিক রেজেক্সটি হ'ল: '^' + সেরাচ_নাম + '$', "আমি"
সুইস

3
এটা বিপজ্জনক. আপনি ব্যবহারকারীর নামটি এড়িয়ে চলছেন না, সুতরাং যেকোনও স্বেচ্ছাসেবী রেজেক্স ইনজেকশন দেওয়া যায়।
টম মেটাম

3

সমষ্টি কাঠামোটি মোংডোব ২.২-এ চালু হয়েছিল। স্ট্রিংগুলির মধ্যে কেস-সংবেদনশীল তুলনা করতে আপনি স্ট্রিং অপারেটর "$ স্টারকেসক্যাম্প" ব্যবহার করতে পারেন। এটি রেগেক্স ব্যবহারের চেয়ে বেশি প্রস্তাবিত এবং সহজ।

একীকরণ কমান্ড অপারেটরের সরকারী দস্তাবেজটি এখানে: https://docs.mongodb.com/manual/references/operator/aggregation/strcasecmp/#exp._S_strcasecmp


4
এটি কীভাবে একটি অনুসন্ধান () ক্যোয়ারিতে ব্যবহার করবেন? db.stuff.find ({নাম: $ strcasecmp (নাম)})?
সুইস

3

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

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

/* 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

সামান্য বাক্যবিন্যাসের সমস্যাটি মনে হচ্ছে (অনুগ্রহ করে ধনুর্বন্ধনী) রয়েছে। দয়া করে ক্যোয়ারীটি আপডেট করুন: db.users.createIndex( { name: 1 }, {collation: { locale: 'tr', strength: 2 } } )
মোহাম্মদ বেলাল

3

একটি ভেরিয়েবল সন্ধান এবং এড়িয়ে যাওয়ার জন্য:

const escapeStringRegexp = require('escape-string-regexp')
const name = 'foo'
db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})   

ভেরিয়েবলটি থেকে বেরিয়ে আসা '। *' বা অন্যান্য রেজেক্সের সাথে আক্রমণগুলির বিরুদ্ধে ক্যোয়ারিকে রক্ষা করে।

পালাবার স্ট্রিং-regexp


1

RegExp ব্যবহার করুন , যদি অন্য কোনও বিকল্প আপনার জন্য কাজ না করে তবে RegExp একটি ভাল বিকল্প। এটি স্ট্রিং কেসকে সংবেদনশীল করে তোলে।

var username = new RegExp("^" + "John" + "$", "i");;

প্রশ্নের মধ্যে ব্যবহারকারীর নাম ব্যবহার করুন এবং তারপরে এটি সম্পন্ন হয়েছে।

আমি আশা করি এটি আপনার পক্ষেও কাজ করবে। শুভকামনা.


0

আমি কেস সংবেদনশীল রেইগেক্সের জন্য একটি সাধারণ ফানক তৈরি করেছি, যা আমি আমার ফিল্টারটিতে ব্যবহার করি।

private Func<string, BsonRegularExpression> CaseInsensitiveCompare = (field) => 
            BsonRegularExpression.Create(new Regex(field, RegexOptions.IgnoreCase));

তারপরে আপনি কেবল নিম্নরূপে কোনও ফিল্ডে ফিল্টার করুন।

db.stuff.find({"foo": CaseInsensitiveCompare("bar")}).count();

0

ফিল্টার ব্যবহার করা আমার জন্য সি # তে কাজ করে।

string s = "searchTerm";
    var filter = Builders<Model>.Filter.Where(p => p.Title.ToLower().Contains(s.ToLower()));
                var listSorted = collection.Find(filter).ToList();
                var list = collection.Find(filter).ToList();

এটি এমনকি সূচকটিও ব্যবহার করতে পারে কারণ আমি বিশ্বাস করি যে রিটার্ন হওয়ার পরে পদ্ধতিগুলি বলা হয়েছিল তবে আমি এখনও এটি পরীক্ষা করে দেখিনি।

এটিও কোনও সমস্যা এড়ায়

var filter = Builders<Model>.Filter.Eq(p => p.Title.ToLower(), s.ToLower());

সেই মংডোব ভাববে যে পি টাইটেল.টোলওয়ার () একটি সম্পত্তি এবং সঠিকভাবে মানচিত্র তৈরি করবে না।


ধন্যবাদ, এটি আমার পক্ষে কাজ করে। এখানে আমাদের ভেরিয়েবলের মধ্যে ফিল্টার পেতে হবে তারপরে ফাইন্ড () পদ্ধতিতে পাস করতে হবে।
নীলে


-1

যেমনটি আপনি মঙ্গো ডক্সে দেখতে পাচ্ছেন - যেহেতু সংস্করণ 3.2 $textসূচকটি ডিফল্টরূপে সংবেদনশীল নয়: https://docs.mongodb.com/manual/core/index-text/#text-index- کیس- সংবেদনশীলতা

আপনার ক্যোয়ারীতে একটি পাঠ্য সূচক তৈরি করুন এবং পাঠ্য অপারেটরটি ব্যবহার করুন


এই ক্ষেত্রে সম্পূর্ণ পাঠ্য অনুসন্ধান ব্যবহার করা ভুল (এবং সম্ভাব্যভাবে) বিপজ্জনক , কারণ প্রশ্নটি কেস-অবশ ক্যোয়ারী, উপার্জন যেমন ছিল) username: 'bill'ম্যাচিং BILLবা Billএকটি পূর্ণ টেক্সট অনুসন্ধান ক্যোয়ারী, যা ম্যাচ হবে, না পক্ষপাতিত্ব শব্দ এর bill, যেমন Bills, billedইত্যাদি
ড্যান Dascalescu

-1

এগুলি স্ট্রিং অনুসন্ধানের জন্য পরীক্ষা করা হয়েছে

{'_id': /.*CM.*/}               ||find _id where _id contains   ->CM
{'_id': /^CM/}                  ||find _id where _id starts     ->CM
{'_id': /CM$/}                  ||find _id where _id ends       ->CM

{'_id': /.*UcM075237.*/i}       ||find _id where _id contains   ->UcM075237, ignore upper/lower case
{'_id': /^UcM075237/i}          ||find _id where _id starts     ->UcM075237, ignore upper/lower case
{'_id': /UcM075237$/i}          ||find _id where _id ends       ->UcM075237, ignore upper/lower case

-1

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং এটিই আমার পক্ষে কাজ করেছে:

  const flavorExists = await Flavors.findOne({
    'flavor.name': { $regex: flavorName, $options: 'i' },
  });

এই সমাধান এর আগেও দু'বার দেওয়া হয়েছিল। একটি নতুন পোস্ট করার আগে দয়া করে বিদ্যমান উত্তরগুলি চেক করুন।
ড্যান ড্যাসক্লেস্কু

@ ড্যানডাসকলেস্কু সিটিআরএল + এফ-এর উপর আপনি কী সম্পর্কে কথা বলছেন তা নিশ্চিত নন, অনেকগুলি আপভোটের সাথে একই রকম সমাধান এটি সেপ্টেম্বর 2018 এ পোস্ট করেছিল I আমি আমার উত্তর এপ্রিল 2018 পোস্ট করেছি I আমি আসলে এটি পোস্ট করেছি কারণ সেই সময়টিতে কোনও কিছুই নেই। যারা খাঁটিভাবে সাহায্যের চেষ্টা করেন তাদের সতর্ক করার আগে দয়া করে এটি কখন পোস্ট করা হয়েছিল তা পরীক্ষা করে দেখুন।
Woppi

আমি এপ্রিল 2016 থেকে এই উত্তর সম্পর্কে বলছি , এবং 2016 সালের মে থেকে এই উত্তরটি use উভয়ই ব্যবহার করুন $regexএবং $options। আপনি Ctrl + F কি করেছেন?
ড্যান ড্যাসকলেসকু

এছাড়াও, ব্যবহার $regexকরা অকার্যকর এবং সম্ভাব্য নিরাপত্তাহীন, যেমনটি আমি আমার এই সম্পাদনাটিতে 2016 এর এই অন্য উত্তরটিতে ব্যাখ্যা করেছি । উত্তরগুলি মুছে ফেলতে কোনও লজ্জা নেই কারণ তারা যদি আর সম্প্রদায়ের সেবা করে না!
ড্যান ড্যাসকলেসকু

অদক্ষ ge রেজেক্সে খ্যাত, অনেক ধন্যবাদ। I Ctrl + F $ বিকল্পগুলি। আমাদের $ রেজেক্স কোড, এপ্রিল 2018 এবং সেপ্টেম্বর 2018 তে নতুন কোনও রেজিএক্সপ্যাক্স সহ আমরা কেবল এখানে দুজন। আমি আমার উত্তরে নতুন রেজিপ্স ব্যবহার করিনি। আমি নতুন রেজিএক্সপক্সের সাথে আমার যে নির্দিষ্ট সমস্যাটি ছিল তা ভুলে গিয়েছিলাম যা আমি যখন এটি সরিয়ে ফেলি এবং ঠিক তখনই পরিবর্তিত পোস্ট করা এই সমাধানটি ব্যবহার করি।
Woppi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.