mongodb / mongoose findMany - অ্যারেতে তালিকাভুক্ত ID সহ সমস্ত নথি সন্ধান করুন


246

আমার _আইডির একটি অ্যারে রয়েছে এবং আমি সে অনুযায়ী সমস্ত ডক্স পেতে চাই, এটি করার সর্বোত্তম উপায় কী?

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

// doesn't work ... of course ...

model.find({
    '_id' : [
        '4ed3ede8844f0f351100000c',
        '4ed3f117a844e0471100000d', 
        '4ed3f18132f50c491100000e'
    ]
}, function(err, docs){
    console.log(docs);
});

অ্যারেতে শত শত _ID থাকতে পারে।

উত্তর:


479

findনকুল ফাংশন MongoDB করার জন্য একটি পূর্ণ অনুসন্ধান। এর অর্থ আপনি হ্যান্ডি মঙ্গোডিবি ক্লজটি ব্যবহার করতে পারেন $in, এটি একই সাথে এসকিউএল সংস্করণের মতো কাজ করে।

model.find({
    '_id': { $in: [
        mongoose.Types.ObjectId('4ed3ede8844f0f351100000c'),
        mongoose.Types.ObjectId('4ed3f117a844e0471100000d'), 
        mongoose.Types.ObjectId('4ed3f18132f50c491100000e')
    ]}
}, function(err, docs){
     console.log(docs);
});

এই পদ্ধতিটি কয়েক হাজার আইডিসহ অ্যারেগুলিতেও ভাল কাজ করবে। (দেখুন কোনও রেকর্ডের মালিককে দক্ষতার সাথে নির্ধারণ করুন )

আমি সুপারিশ করব যে যে কেউ চমত্কার অফিসিয়াল মঙ্গোডিবি ডক্সের অ্যাডভান্সড কোয়েরি বিভাগের mongoDBমাধ্যমে পড়া নিয়ে কাজ করছে


9
এই আলোচনার জন্য দেরী করা, তবে আপনি কীভাবে নিশ্চিত করবেন যে ফিরিয়ে দেওয়া আইটেমগুলির ক্রমটি আপনি অ্যারে সরবরাহ করে এমন আইটেমির অ্যারের সাথে মিলছে? আপনি কোনও বাছাই নির্দিষ্ট না করে ডকুমেন্টগুলি কোনও ক্রমে বেরিয়ে আসার নিশ্চয়তা নেই। আপনি যদি তাদের একই বিন্যাসে বাছাই করতে চান তবে আপনি তাদের অ্যারেতে তালিকাবদ্ধ করুন (যেমন ... 000c, ... 000 ডি, ... 000e)?
কেভিন

7
এটি কোনও কারণে কার্যকর হয়নি। আমি ডক্সের খালি অ্যারে পেয়েছি
chovy

2
@ chovy স্ট্রিংগুলি পাস করার পরিবর্তে প্রথমে সেগুলিকে অবজেক্টআইডে রূপান্তরিত করার চেষ্টা করুন
জর্জি হরিস্টোজভ

@ জর্জিহ্রিস্টোজভ আমি একটি কাস্টম আইডি জেনারেটর ব্যবহার করছি ... অবজেক্টআইডে রূপান্তর করা কি এখনও কাজ করে? (মঙ্গুজ + সংক্ষিপ্ত)
chovy

1
@ স্কাইবো যা একেবারেই কোনও পার্থক্য করে না। { _id : 5 }হিসাবে একই { '_id' : 5 }
রোহুই

27

আইডি হ'ল অবজেক্ট আইডির অ্যারে:

const ids =  [
    '4ed3ede8844f0f351100000c',
    '4ed3f117a844e0471100000d', 
    '4ed3f18132f50c491100000e',
];

কলব্যাক দিয়ে মঙ্গুজ ব্যবহার করা:

Model.find().where('_id').in(ids).exec((err, records) => {});

অ্যাসিঙ্ক ফাংশন সহ মঙ্গুজ ব্যবহার করা:

records = await Model.find().where('_id').in(ids).exec();

আপনার আসল মডেলের সাথে মডেলটি পরিবর্তন করতে ভুলবেন না।


এটি সর্বাধিক আপ টু ডেট এবং সুসংগত উত্তর হিসাবে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনাকে গৃহীত উত্তরের মতো আইডিকে অবজেক্টআইডে রূপান্তর করতে হবে না এবং এটি মঙ্গুজের অপরিহার্য শৈলী অনুসন্ধানগুলি ব্যবহার করে । ধন্যবাদ বিটিডব্লিউ!
জাভি মারজান

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

9

অনুসন্ধানের এই ফর্ম্যাটটি ব্যবহার করুন

let arr = _categories.map(ele => new mongoose.Types.ObjectId(ele.id));

Item.find({ vendorId: mongoose.Types.ObjectId(_vendorId) , status:'Active'})
  .where('category')
  .in(arr)
  .exec();

4

নোড.জে এবং মঙ্গো শেফ উভয়ই আমাকে অবজেক্টআইডে রূপান্তর করতে বাধ্য করে। এটি আমি ডিবি থেকে ব্যবহারকারীদের একটি তালিকা দখল করতে এবং কয়েকটি বৈশিষ্ট্য আনতে ব্যবহার করি। 8 লাইন টাইপ রূপান্তর মনে।

// this will complement the list with userName and userPhotoUrl based on userId field in each item
augmentUserInfo = function(list, callback){
        var userIds = [];
        var users = [];         // shortcut to find them faster afterwards
        for (l in list) {       // first build the search array
            var o = list[l];
            if (o.userId) {
                userIds.push( new mongoose.Types.ObjectId( o.userId ) );           // for the Mongo query
                users[o.userId] = o;                                // to find the user quickly afterwards
            }
        }
        db.collection("users").find( {_id: {$in: userIds}} ).each(function(err, user) {
            if (err) callback( err, list);
            else {
                if (user && user._id) {
                    users[user._id].userName = user.fName;
                    users[user._id].userPhotoUrl = user.userPhotoUrl;
                } else {                        // end of list
                    callback( null, list );
                }
            }
        });
    }

7
ইউজারআইডস = _.ম্যাপ (তালিকা, ফাংশন (ইউজারআইডি) {ফিরুন মঙ্গুজ.টিপস.অবজেক্টআইডি (ইউজারআইডি)
মাইকেল ড্রপার

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