var thename = 'Andrew';
db.collection.find({'name':thename});
আমি কীভাবে সংবেদনশীলকে জিজ্ঞাসা করব? "অ্যান্ড্রু" হলেও ফলাফল খুঁজে পেতে চাই;
var thename = 'Andrew';
db.collection.find({'name':thename});
আমি কীভাবে সংবেদনশীলকে জিজ্ঞাসা করব? "অ্যান্ড্রু" হলেও ফলাফল খুঁজে পেতে চাই;
উত্তর:
ক্রিস ফুলস্টোর সমাধান (+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
।
new RegExp('^'+ username + '$', "i")
একটি সঠিক মিল হতে match
".*"
।
আপনার এটির জন্য কেস-সংবেদনশীল নিয়মিত ভাব প্রকাশ করা দরকার, যেমন
db.collection.find( { "name" : { $regex : /Andrew/i } } );
আপনার thename
ভেরিয়েবল থেকে রেজেক্স প্যাটার্নটি ব্যবহার করতে একটি নতুন রেজিএক্সপেক্ট অবজেক্ট তৈরি করুন:
var thename = "Andrew";
db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } );
আপডেট: সঠিক মিলের জন্য, আপনার পুনরায় ব্যবহার করতে হবে "name": /^Andrew$/i
। ইয়্যানিক এলকে ধন্যবাদ
name
{ "name": /^Andrew$/i }
আমি এটি এর মতো সমাধান করেছি।
var thename = 'Andrew';
db.collection.find({'name': {'$regex': thename,$options:'i'}});
আপনি যদি 'কেস-সংবেদনশীল হুবহু মিল' সম্পর্কিত প্রশ্নটি করতে চান তবে আপনি এটি যেতে পারেন।
var thename = '^Andrew$';
db.collection.find({'name': {'$regex': thename,$options:'i'}});
মঙ্গোডিবি ৩.৪-এ এখন একটি সত্যিকারের কেস-সংবেদনশীল সূচক তৈরি করার ক্ষমতা অন্তর্ভুক্ত রয়েছে, যা বড় ডেটাসেটগুলিতে সংক্ষিপ্ত আকারের কেস সংবেদনশীল অনুসন্ধানের গতি বাড়িয়ে তুলবে। এটি 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
মঙ্গুজ (এবং নোড) এর সাথে, এটি কাজ করেছে:
User.find({ email: /^name@company.com$/i })
User.find({ email: new RegExp(
`^ $ {ইমেল পরিবর্তনশীল} $`, 'আমি')})
মঙ্গোডিবিতে, এটি কাজ করেছে:
db.users.find({ email: { $regex: /^name@company.com$/i }})
দুটি লাইনই কেস-সংবেদনশীল। ডিবিতে ইমেলটি হতে পারে NaMe@CompanY.Com
এবং উভয় লাইনই ডিবিতে অবজেক্টটি আবিষ্কার করবে।
তেমনি, আমরা ব্যবহার করতে পারি /^NaMe@CompanY.Com$/i
এবং এটি এখনও ইমেল খুঁজে পেতে পারে : name@company.com
ডিবিতে।
সংবেদনশীল স্ট্রিংটি কেসটি সন্ধান করতে এটি ব্যবহার করুন,
var thename = "Andrew";
db.collection.find({"name":/^thename$/i})
আমি কয়েক ঘন্টা আগে এই সমস্যাটি সমাধান করেছি।
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
... নোডজেএস-তে মঙ্গুসের সাথে এই ক্যোয়ারী:
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);
});
});
কেস-সংবেদনশীল আক্ষরিক স্ট্রিংটি খুঁজতে:
db.collection.find({
name: {
$regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')
}
});
db.collection.find({
name_lower: name.toLowerCase()
});
আক্ষরিক স্ট্রিং মিলের চেয়ে নিয়মিত প্রকাশগুলি ধীর হয়। তবে একটি অতিরিক্ত ছোট ছোট ক্ষেত্র আপনার কোডের জটিলতা বাড়িয়ে তুলবে। সন্দেহ হলে নিয়মিত ভাব প্রকাশ করুন। আমি কেবলমাত্র একটি স্পষ্টত লোয়ার-কেস ফিল্ড ব্যবহার করার পরামর্শ দেব যদি এটি আপনার ক্ষেত্রটি প্রতিস্থাপন করতে পারে, তবে, আপনি প্রথমে কেসটির বিষয়ে চিন্তা করবেন না।
মনে রাখবেন যে রেজেেক্সের আগে আপনাকে নামটি পালাতে হবে। আপনি যদি ব্যবহারকারী-ইনপুট ওয়াইল্ডকার্ডগুলি চান, তবে .replace(/%/g, '.*')
পালানোর পরে সংযোজন পছন্দ করুন যাতে 'a' দিয়ে শুরু হওয়া সমস্ত নাম খুঁজে পেতে আপনি "%" এর সাথে মিল রাখতে পারেন।
আপনি কেস সংবেদনশীল সূচকগুলি ব্যবহার করতে পারেন :
নিম্নোক্ত উদাহরণটি কোনও ডিফল্ট কোলেশন ছাড়াই একটি সংগ্রহ তৈরি করে, তারপরে কেস সংবেদনশীল কোলেশন সহ নামের ক্ষেত্রে একটি সূচক যুক্ত করে। ইউনিকোডের জন্য আন্তর্জাতিক উপাদানসমূহ
/*
* 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.aggregate([
{
$project: {
name: { $toLower: "$name" }
}
},
{
$match: {
name: the_name_to_search
}
}
])