কোনও ফিল্ডে একটি স্ট্রিং রয়েছে কিনা তা পরীক্ষা করা হচ্ছে


453

আমি এমন কোনও অপারেটর খুঁজছি, যা আমাকে যাচাই করতে দেয়, যদি কোনও ক্ষেত্রের মানটিতে একটি নির্দিষ্ট স্ট্রিং থাকে।

কিছুটা এইরকম:

db.users.findOne({$contains:{"username":"son"}})

এটা কি সম্ভব?

উত্তর:


692

আপনি নিম্নলিখিত কোড দিয়ে এটি করতে পারেন।

db.users.findOne({"username" : {$regex : ".*son.*"}});

16
নোট করুন যে এটি একটি সূচককে দক্ষভাবে ব্যবহার করবে না এবং ফলস্বরূপ সমস্ত মান মিলবে। নিয়মিত এক্সপ্রেশনগুলিতে
স্টেনি

7
@ স্টেনি, তারপরে আপনি কী সূচকে দক্ষভাবে ব্যবহার করতে এবং একটি স্ট্রিংয়ের সন্ধানের পরামর্শ দিচ্ছেন।
ব্লু স্কাই

4
@ উইশ: যদি আপনার সাধারণ ব্যবহারের ক্ষেত্রটি কোনও ক্ষেত্রের ফ্রি-পাঠ্য সন্ধান হয় এবং আপনার কাছে প্রচুর ডকুমেন্ট রয়েছে, তবে আরও দক্ষ প্রশ্নের জন্য আমি পাঠ্যটিকে টোকনাইজ করব। আপনি একটি সাধারণ পূর্ণ-পাঠ্য অনুসন্ধানের জন্য মাল্টিকেগুলি ব্যবহার করতে পারেন বা একটি পৃথক সংগ্রহ হিসাবে একটি উল্টানো সূচক তৈরি করতে পারেন । অবিচ্ছিন্ন অনুসন্ধান বা দস্তাবেজের একটি ছোট সংগ্রহের জন্য, সম্পূর্ণ সূচকটি স্ক্যান করা গ্রহণযোগ্য হতে পারে (যদিও সর্বোত্তম নয়) performance
স্টেনি

98
এটি কি খুব বেশি ওভারকিল নয়? আপনি যা চান তা হ'ল db.users.findOne({"username" : {$regex : "son"}});
জামিজেগ


179

মোঙ্গো শেল সমর্থন রেজিক্স হিসাবে, এটি সম্পূর্ণ সম্ভব।

db.users.findOne({"username" : /.*son.*/});

আমরা যদি জিজ্ঞাসাটি কেস-সংবেদনশীল হতে চাই তবে আমরা নীচে দেখানো মত "i" বিকল্পটি ব্যবহার করতে পারি:

db.users.findOne({"username" : /.*son.*/i});

দেখুন: http://www.mongodb.org/display/DOCS/Advanced+ Queries#AdvancedQueries- RegularExpressions


1
সন্ধানের জন্য নিয়মিত এক্সপ্রেশন ব্যবহারের জন্য প্রদর্শিত একটি কোড স্নিপেট অন্তর্ভুক্ত করুন। উত্তরগুলিতে কেবলমাত্র একটি লিঙ্কের চেয়ে আরও তথ্য অন্তর্ভুক্ত করা উচিত ...
মায়ারিক্স

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

5
নির্বাচিত উত্তরের মতামতগুলির মত আমার বিশ্বাস db.users.findOne({"username" : /.*son.*/});যে /son/
ওভারকিলও

2
Ge

4
কেবল এটি ব্যবহার করতে এটি সম্পাদনা করুন{ username: /son/ }
উইক

150

https://docs.mongodb.com/manual/reference/sql-comparison/

http://php.net/manual/en/mongo.sqltomongo.php

মাইএসকিউএল

SELECT * FROM users WHERE username LIKE "%Son%"

MongoDB

db.users.find({username:/Son/})

8
আপনার মঙ্গোডিবি উত্তর ভাল; অপ্রাসঙ্গিক মাইএসকিউএল পরামর্শ সরাতে আপনার প্রশ্ন সম্পাদনা বিবেচনা করুন।
maerics

31
সমস্ত কোয়েরি সরান বা এটি পরিবর্তন? সর্বাধিক জ্ঞাত এসকিউএল, এটি মঙ্গোডিবি বোঝার জন্য সহায়ক
ঝেং

4
@ ঝেংকাই: এই ওয়েবসাইটে আপনাকে সাধারণত ট্যাগ করা এবং অনুরোধ করা নির্দিষ্ট প্রযুক্তি ব্যবহার করে সরাসরি প্রশ্নের উত্তর দিতে হবে।
maerics

98
@ মায়ারিকস ব্যক্তিগতভাবে আমি জেং এর মাইএসকিউএল অন্তর্ভুক্তি খুব দরকারী হিসাবে এটি একটি পয়েন্ট প্রদান করে।
মাইক বার্টলেট

50
আমি এসকিউএল রেফারেন্সটি প্রাসঙ্গিকও পেয়েছি, আমার মনে হয় এটি থাকা উচিত।
ভাইকিংস্টিভ

69

সংস্করণ ২.৪ অনুসারে, আপনি অনুসন্ধানের জন্য $ পাঠ্য অপারেটরটি অনুসন্ধান করতে এবং ক্ষেত্রের (গুলি) একটি পাঠ্য সূচক তৈরি করতে পারেন ।

প্রথমে সূচকটি তৈরি করুন:

db.users.createIndex( { "username": "text" } )

তারপরে, অনুসন্ধান করতে:

db.users.find( { $text: { $search: "son" } } )

বেঞ্চমার্কস (K 150 কে ডকুমেন্টস):

  • রেজেক্স (অন্যান্য উত্তর) => 5.6-6.9 সেকেন্ড
  • পাঠ্য অনুসন্ধান => .164-.201 সেকেন্ড

মন্তব্য:

  • একটি সংগ্রহে কেবল একটি পাঠ্য সূচক থাকতে পারে। যদি আপনি অনুসন্ধান করতে চান আপনি একটি ওয়াইল্ড কার্ড টেক্সট সূচক ব্যবহার করতে পারেন কোন স্ট্রিং ক্ষেত্র, এরকম: db.collection.createIndex( { "$**": "text" } )
  • একটি পাঠ্য সূচক বড় হতে পারে। এটিতে প্রতিটি নথি সন্নিবেশিত প্রতিটি ক্ষেত্রের প্রতিটি স্বতন্ত্র পোস্ট-স্টেম্মড শব্দের জন্য একটি সূচক এন্ট্রি রয়েছে।
  • একটি পাঠ্য সূচকটি সাধারণ সূচকের চেয়ে বেশি সময় নিতে পারে।
  • একটি পাঠ্য সূচী নথিতে শব্দের সান্নিধ্য সম্পর্কে বাক্যাংশ বা তথ্য সংরক্ষণ করে না। ফলস্বরূপ, বাক্যাংশের অনুসন্ধানগুলি আরও কার্যকরভাবে চলবে যখন পুরো সংগ্রহটি র‍্যামের সাথে ফিট করে।

14
না, ইনফ্যাক্ট টেক্সট অপারেটর "অন্তর্ভুক্ত" চালানোর অনুমতি দেয় না, সুতরাং এটি কেবল সঠিক শব্দের মিলটি ফিরিয়ে দেবে, বর্তমানে 3.0 হিসাবে একমাত্র বিকল্পটি রেগেক্স ব্যবহার করা হবে, অর্থাত্ db.users.find ({ব্যবহারকারী নাম: / পুত্র / i} ) এটি "পুত্র" (কেস-ইনসেভেটিভ)
কমজিটসোমযুক্ত

3
আপনি যখন সংগ্রহ থেকে / থেকে দস্তাবেজগুলি যুক্ত করবেন বা সরিয়ে ফেলবেন তখন কি আপনাকে পুনর্নির্দেশনা করতে হবে?
জ্যাক উইলসন

প্রশ্নের শিরোনাম বলে "রয়েছে"। পুরো পাঠ্য অনুসন্ধান প্রশ্নের জন্য প্রযোজ্য নয়।
দোনাতো

29

যেহেতু এটি সার্চ ইঞ্জিনগুলির প্রথম হিটগুলির মধ্যে একটি এবং উপরের কোনওটি মঙ্গোডিবি ৩.x এর জন্য কাজ করে বলে মনে হচ্ছে না, এখানে একটি রেইজেক্স অনুসন্ধান রয়েছে যা কাজ করে:

db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )

কোনও অতিরিক্ত সূচক তৈরি বা একইভাবে তৈরি করার দরকার নেই।


1
রেজেক্সগুলি স্যানিটাইজ করা দরকার।
শান

16

আপনি যদি পাইথনের মাধ্যমে মঙ্গোডিবি সংযুক্ত করছেন তবে আপনাকে যা করতে হবে তা এখানে

db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}})

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


es2015 এ আপনি ব্যাকটিক্স ব্যবহার করতে পারেন $ রেজেেক্স: .*${value}.*}
মাইকেল গিল্ড

16

এই কাজটি সম্পাদন করার সহজ উপায়

আপনি যদি জিজ্ঞাসাটি কেস-সংবেদনশীল হতে চান

db.getCollection("users").find({'username':/Son/})

আপনি যদি জিজ্ঞাসাটি কেস-সংবেদনশীল হতে চান

db.getCollection("users").find({'username':/Son/i})

1
রিজেক্সের সাথে পরিবর্তনশীল কীভাবে ব্যবহার করবেন ??
হিশাম

4

সংক্ষিপ্ত সংবেদনশীলর জন্য এর আদর্শ সূচক i বিকল্পটির উত্তর দিন

db.users.findOne({"username" : new RegExp(search_value, 'i') });

রেজেক্সগুলি স্যানিটাইজ করা দরকার।
শান

2

এটি কাজ করা উচিত

db.users.find({ username: { $in: [ /son/i ] } });

iকেবলমাত্র অক্ষরের একক মামলার সাথে সীমাবদ্ধতা রোধ করার জন্য কেবল এটিই রয়েছে।

আপনি মঙ্গোডিবি ডকুমেন্টেশনে ge রেজেক্স ডকুমেন্টেশন চেক করতে পারেন। এখানে একটি লিঙ্ক রয়েছে: https://docs.mongodb.com/manual/references/operator/query/regex/


1

একটি রেজিপ্যাক্স ম্যাচে এইচটিএমএল ট্যাগগুলি কীভাবে উপেক্ষা করবেন:

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="https://stackoverflow.com/wiki/Felidae" title="Felidae">cat</a> <a href="https://stackoverflow.com/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="https://stackoverflow.com/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="https://stackoverflow.com/wiki/Lion" title="Lion">lion</a>, <a href="https://stackoverflow.com/wiki/Leopard" title="Leopard">leopard</a>, <a href="https://stackoverflow.com/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="https://stackoverflow.com/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="https://stackoverflow.com/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="https://stackoverflow.com/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="https://stackoverflow.com/wiki/Deer" title="Deer">deer</a> and <a href="https://stackoverflow.com/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';

var rx = '';
searchString.split(' ').forEach(e => {
  rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});

rx = new RegExp(rx, 'igm');

console.log(text.match(rx));

এটি সম্ভবত মঙ্গোডিবি সমষ্টি ফিল্টারে রূপান্তরিত করা খুব সহজ।

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