পিমোঙ্গো দিয়ে রেজেক্স ক্যোয়ারী সম্পাদন করা হচ্ছে


129

আমি একটি মোংডব সার্ভারের বিরুদ্ধে পাইমোঙ্গো ব্যবহার করে একটি রেজেক্স ক্যোয়ারী সম্পাদন করার চেষ্টা করছি। নথির কাঠামোটি নিম্নরূপ

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

আমি প্যাটার্ন * ফাইলের সাথে মেলে এমন সমস্ত ফাইল পেতে চাই। আমি এই হিসাবে এটি করার চেষ্টা করেছি

db.collectionName.find({'files':'/^File/'})

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

উত্তর:


191

আপনি যদি নিয়মিত প্রকাশের বিকল্পগুলি অন্তর্ভুক্ত করতে চান (যেমন কেস উপেক্ষা করুন), এটি চেষ্টা করুন:

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})

8
এও লক্ষ্য করুন যে রেজেজের শুরুতে অ্যাঙ্করড (অর্থাত: শুরু করা ^) ডিবিতে সূচকগুলি ব্যবহার করতে সক্ষম হয় এবং সেই ক্ষেত্রে এটি আরও দ্রুত চলবে।
ড্রিভিকো

1
রেজেক্সের ^ দিয়ে শুরু করা নির্দিষ্ট কিছু ক্ষেত্রে কেবল একটি সূচক ব্যবহার করতে পারে । পুনঃনিররেসেস ব্যবহার করার সময় আমি বিশ্বাস করি মঙ্গো কোয়েরি সম্পাদন করতে কোনও সূচক ব্যবহার করতে পারে না।
নোনগন

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

153

দেখা যাচ্ছে রেমেক্স অনুসন্ধানগুলি পাইমঙ্গোতে কিছুটা আলাদাভাবে করা হয় তবে এটি ঠিক তত সহজ।

রেজেজেক্স নিম্নলিখিত হিসাবে সম্পন্ন করা হয়:

db.collectionname.find({'files':{'$regex':'^File'}})

এটি ফাইলের সাথে শুরু হওয়া আইটেমের মধ্যে একটি ফাইল সম্পত্তি রয়েছে এমন সমস্ত দস্তাবেজের সাথে মিলবে


9
প্রকৃতপক্ষে, আপনি এখানে কীভাবে জাভাস্ক্রিপ্টে (এবং সম্ভবত অন্যান্য ভাষাগুলিতেও) এটি ব্যবহার করেছেন সেভাবেই $regex। @ এরিকের উত্তরটি অজগর উপায় যা কিছুটা আলাদা।
ড্রিভিকো

পার্থক্য কি? তারা দুজনেই পাইথন পাইমোঙ্গো সঠিক ব্যবহার করছে? এটি মঙ্গডব ক্যোয়ারির অংশ তাই আমি সমস্যাটি সত্যিই দেখছি না।
ডেক্সটার

10
মঙ্গডব জেএসক্রিপ্টের রিজেক্সেও উপেক্ষা সম্ভব। db.collectionname.find ({'ফাইল': {'$ regex': '^ ফাইল', '$ বিকল্প': 'i'}})
অজয় গুপ্ত

5
এই উত্তরটি আমার চোখে আরও ভাল লাগছে। কেন আপনি পাইথন আরই কে সংকলন করতে কেন বিরক্ত করছেন যদি আপনি কেবল এটির স্ট্রিংফাই করতে চলেছেন যাতে মঙ্গো আবার এটি সংকলন করতে পারে? মঙ্গোর $regexঅপারেটর একটি $optionsযুক্তি নিয়েছে।
মার্ক ই। হাজেস

3
অন্যান্য সমস্যা এড়াতে দয়া করে r'^File'পরিবর্তে ব্যবহার করুন'^File'
আমিনাহ নুরাইনি

9

দ্বৈত সংকলন এড়ানোর জন্য আপনি পাইমঙ্গোর সাথে আসা ব্যসন রেজেক্স র‌্যাপারটি ব্যবহার করতে পারেন:

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

রেজেেক্স কেবল স্ট্রিংটি সংকলনের চেষ্টা না করে সঞ্চয় করে, তাই Find_one তারপরে আর্গুমেন্টটিকে 'রেজেক্স' টাইপ হিসাবে সনাক্ত করতে পারে এবং উপযুক্ত মঙ্গো ক্যোয়ারী গঠন করতে পারে।

আমি অনুভব করি যে এইভাবে অন্যান্য শীর্ষ উত্তরগুলির চেয়ে কিছুটা বেশি পাইথোনিক eg

>>> db.collectionname.find({'files':{'$regex':'^File'}})

আপনি যদি রেজেক্স ক্যোয়ারী ব্যবহার করার পরিকল্পনা করে থাকেন তবে কিছু ক্যাভেট রয়েছে বলে এটি বিসন রেজেক্স ডকুমেন্টেশন পড়ার পক্ষে উপযুক্ত।


1
আপনার যদি আবার একটি অ্যারের সাথে মিলের প্রয়োজন হয় তবে $ ইন using ব্যবহার করে আপনার জন্য কাজ করবে না ge bson.regex.Regex কৌতুক করবে!
ওডেডফস

4

এর সমাধানটি reসূচকটি মোটেই ব্যবহার করে না। আপনার কমান্ডগুলি ব্যবহার করা উচিত:

db.collectionname.find({'files':{'$regex':'^File'}})

(আমি তাদের উত্তরের নীচে মন্তব্য করতে পারি না, তাই আমি এখানে জবাব দিয়েছি)

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