অ্যারে সহ একটি দস্তাবেজ সন্ধান করুন যাতে একটি নির্দিষ্ট মান থাকে


499

আমার যদি এই স্কিমা থাকে ...

person = {
    name : String,
    favoriteFoods : Array
}

... যেখানে favoriteFoodsঅ্যারেটি স্ট্রিং সহ জনবহুল। "সুশী" থাকা সমস্ত ব্যক্তিকে আমি কীভাবে মঙ্গুজ ব্যবহার করে তাদের পছন্দসই খাবার হিসাবে খুঁজে পাব?

আমি লাইন বরাবর কিছু জন্য আশা ছিল:

PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});

(আমি জানি যে $containsমোংডোব-তে কোনও নেই , সমাধানটি জানার আগে আমি কী আশা করছিলাম তা ব্যাখ্যা করে)

উত্তর:


693

হিসাবে favouriteFoodsস্ট্রিং একটি সহজ অ্যারের হয়, তাহলে আপনি ঠিক যে ক্ষেত্র খোঁজ করতে পারেন সরাসরি:

PersonModel.find({ favouriteFoods: "sushi" }, ...);

তবে আমি আপনার স্কিমাতে স্ট্রিং অ্যারেটি সুস্পষ্ট করারও পরামর্শ দেব:

person = {
    name : String,
    favouriteFoods : [String]
}

সম্পর্কিত ডকুমেন্টেশন এখানে পাওয়া যাবে: https://docs.mongodb.com/manual/tutorial/query-arrays/


19
এটি যদি favouriteFoodsহয় তবে তাও কাজ করে :favouriteFoods:[{type:Schema.Types.ObjectId, ref:'Food'}]
k88074

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

9
এটা ভুল করবেন না। এমনকি এটি ডিকের একটি তালিকা থাকলেও আপনি এখনও এটিকে জিজ্ঞাসা করতে পারেন। নমুনা: PersonModel.find({ favouriteFoods.text: "sushi" }, ...); person = { name : String, favouriteFoods : [{text:String}] }
আমিনাহ নুরাইনি

3
আমি যখন কমপক্ষে দুটি স্ট্রিং যুক্ত এমন একটি অ্যারের সন্ধান করতে চাই তখন কী ঘটে?
অ্যারো ওয়াং

151

$containsমংডোবে কোনও অপারেটর নেই ।

আপনি জনিএইচকে থেকে উত্তরটি কাজ হিসাবে এটি ব্যবহার করতে পারেন। মঙ্গো রয়েছে যেটির নিকটতম সাদৃশ্যটি হ'ল এটি $inব্যবহার করে আপনার ক্যোয়ারীটি এমন দেখাচ্ছে:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);

10
এটা কি সঠিক? মংডব ইন ব্যবহার করার সময় মানগুলির একটি অ্যারের আশা করে না? যেমন {নাম: {$ ইন: ["পল", "ডেভ", "ল্যারি", "অ্যাডাম"]}}?
লুডভিগ ম্যাগনুসন

37
তাই না? এটি অপ্রয়োজনীয়। $inযখন আপনার একাধিক ক্যোয়ারী মান থাকে এবং ডকুমেন্টটির মধ্যে একটির সাথে মেলে প্রয়োজন হয়। বিপরীতে (যা এই প্রশ্নটি যা সম্পর্কে রয়েছে), জনিএইচকে-র উত্তরটি সঠিক। আমি ডাউনটাতে যাচ্ছিলাম তবে আমার ধারণা এই উত্তরটি এই পৃষ্ঠায় শেষ হওয়া অন্যান্য লোকদের পক্ষে সহায়ক হতে পারে।
ম্যালকম্মিশন

4
তবে এটি আমাকে বেশ কয়েকটি মান সহ জিজ্ঞাসা করতে সহায়তা করেছিল: ডি অনেক ধন্যবাদ!
আলেকজান্দার বুউলিয়ার

10
ধন্যবাদ। এটিই আমি প্রকৃতপক্ষে খুঁজছিলাম, একাধিক মান সন্ধানের উপায়:PersonModel.find({favouriteFoods: {"$in": ["sushi", "hotdog"]}})
টটিমেডলি

@ ম্যালকামমোশন সঠিক, যেটিতে অপারেটরটি বিপরীত হয়, যার মান হিসাবে অ্যারে থাকে । ক্ষেত্র একটি অ্যারের হচ্ছে কি প্রশ্ন সম্পর্কে জিজ্ঞাসা করা হয়। যাইহোক, যদি উভয় ক্ষেত্র এবং মান অ্যারে হয়, তারপর উভয় এই উত্তর এবং JohnnyHK এর প্রাসঙ্গিক অর্থ আপনি প্রয়োজন $ কি করে।
tscizzle

87

আমার মনে $allহয় এই পরিস্থিতিতে আরও উপযুক্ত হবে। আপনি যদি এমন কোনও ব্যক্তির সন্ধান করেন যা সুশীতে থাকে তবে আপনি:

PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})

আপনি যেমন আরও অনুসন্ধানগুলি ফিল্টার করতে চাইতে পারেন তেমন:

PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})

$inOR এর $allমতো এবং AND এর মতো। এটি দেখুন: https://docs.mongodb.com/manual/references/operator/query/all/


দুঃখিত, এটি আমার প্রশ্নের একটি ভুল উত্তর। আমি কোনও সঠিক মিলের জন্য খুঁজছি না তবে কেবল অ্যারেগুলির জন্য যা কমপক্ষে নির্দিষ্ট করে দেওয়া মান রয়েছে।
লুডভিগ ম্যাগনুসন

17
এটি আপনার প্রশ্নের একটি সঠিক বৈধ উত্তর! একটি মানের জন্য সমস্ত বা or ইন ব্যবহার করার ক্ষেত্রে কোনও পার্থক্য নেই। যদি আপনার "সুশী", "কলা" এর মতো বেশ কয়েকটি মান থাকে তবে $ সকলেই এমন ব্যক্তিদের সন্ধান করছেন যাঁদের পছন্দের ফুড অ্যারেতে "সুশী" এবং "কলা" রয়েছে, যদি আপনি using ব্যবহার করে থাকেন তবে এমন ব্যক্তিরা পাচ্ছেন যাঁরা "সুশি" বা "কলা আছে have "তাদের প্রিয় খাবারের অ্যারেতে।
Jodo

হ্যাঁ, এখানে কোনও $ রয়েছে তবে $ সবই এর সাজান
দ্যাটদিনহোকোক

2
সেরা উত্তর।
নিকোলে তেনস্কভ

65

যদি অ্যারেতে অবজেক্ট থাকে তবে উদাহরণস্বরূপ যদি favouriteFoodsনিম্নলিখিত পদগুলির একটি অ্যারে থাকে:

{
  name: 'Sushi',
  type: 'Japanese'
}

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

PersonModel.find({"favouriteFoods.name": "Sushi"});

2
এটি সহজেই সেরা উত্তর। আপনি যখন তাড়াতাড়ি থাকবেন তখন ব্যবহার করা আরও সহজ to
উবার শ্নুজ

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

32

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

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

এই ক্যোয়ারীটি এই পোস্ট থেকে নেওয়া হয়েছে: শূন্য মানগুলির সাথে মঙ্গোডিবি কোয়েরি অ্যারে

এটি একটি দুর্দান্ত সন্ধান ছিল এবং এটি আমার নিজের প্রাথমিক এবং ভুল সংস্করণের চেয়ে অনেক ভাল কাজ করে (যা কেবলমাত্র একটি উপাদানযুক্ত অ্যারেগুলির জন্য দুর্দান্ত কাজ করেছে):

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})

3

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

  PersonModel.aggregate([
            { 
                 "$match": { 
                     $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ]  }
             },
             { $project : {"_id": 0, "name" : 1} }
            ]);

মঙ্গডব ৪.২ নিয়ে কাজ করছেন না ... দয়া করে উত্তর দিন
ভিমি

আপনি কোন ত্রুটি পাচ্ছেন, দয়া করে বিস্তারিত দিন?
অমিতেশ

3

লুকিং_ফুড_আরে অ্যারে হয়।

match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}

লুচিং_ফুড_আরয়ের ক্ষেত্রে স্ট্রিং।

match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}

1

লুপব্যাক 3 এর জন্য প্রদত্ত সমস্ত উদাহরণ আমার পক্ষে কার্যকর হয়নি, বা যাইহোক আরআরটিএসপি এপিআই ব্যবহার করার মত দ্রুত। তবে এটি আমাকে আমার সঠিক উত্তরটি খুঁজে পেতে সহায়তা করেছিল।

{"where":{"arrayAttribute":{ "all" :[String]}}}


1
আপনি জীবন রক্ষাকারী, ধন্যবাদ! সেই নথিটি কোথায় আছে এবং আমি এটি মিস করেছি? আপনি কি লিঙ্কটি পোস্ট করতে পারেন? ধন্যবাদ।
ব্যবহারকারী 2078023

-3

আপনি যদি জাভাস্ক্রিপ্টের মাধ্যমে "অন্তর্ভুক্ত" অপারেটরের মতো কিছু ব্যবহার করতে চান তবে আপনি সর্বদা এর জন্য নিয়মিত প্রকাশটি ব্যবহার করতে পারেন ...

যেমন। বলুন যে আপনি "বার্টোলোমিউ" নামক গ্রাহককে পুনরুদ্ধার করতে চান

async function getBartolomew() {
    const custStartWith_Bart = await Customers.find({name: /^Bart/ }); // Starts with Bart
    const custEndWith_lomew = await Customers.find({name: /lomew$/ }); // Ends with lomew
    const custContains_rtol = await Customers.find({name: /.*rtol.*/ }); // Contains rtol

    console.log(custStartWith_Bart);
    console.log(custEndWith_lomew);
    console.log(custContains_rtol);
}

-26

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

PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'});

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


কৌতূহলের বাইরে, এইভাবে করার কোনও সুবিধা আছে কি?
লুডউইগ ম্যাগনুসন

5
গৃহীত উত্তরের তুলনায় এটি অবিশ্বাস্যভাবে অক্ষম; এটি মন্টো গ্রহণযোগ্যতার মতো একটি সরল সন্ধানের জন্য দৃশ্যের পিছনে রাখে সমস্ত অপটিমাইজেশনকে বাধা দেয়।
অনিচ্ছাকৃত

1
যদিও আমার ক্ষেত্রে আমার এই প্রশ্নের উত্তর দরকার ছিল! আপনাকে "ব্যবহারকারী" ধন্যবাদ :)
ভ্যাসিল বোরোভিয়াক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.