mongodb / mongoose findMany - सरणी में सूचीबद्ध ID के साथ सभी दस्तावेज़ ढूंढें


246

मेरे पास _ids की एक सरणी है और मैं तदनुसार सभी डॉक्स प्राप्त करना चाहता हूं, इसके लिए सबसे अच्छा तरीका क्या है?

कुछ इस तरह ...

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

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

सरणी में सैकड़ों _ids हो सकते हैं।

जवाबों:


479

findनेवला में समारोह MongoDB के लिए एक पूर्ण क्वेरी है। इसका मतलब यह है कि आप आसान mongoDB $inक्लॉज का उपयोग कर सकते हैं , जो उसी के SQL संस्करण की तरह काम करता है।

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

यह विधि दसियों हज़ार आईडी वाले सरणियों के लिए भी अच्छी तरह से काम करेगी। ( रिकॉर्ड के मालिक का कुशल निर्धारण करें )

मैं सुझाव दूंगा कि कोई भी उत्कृष्ट सरकारी mongoDB डॉक्सmongoDB के उन्नत प्रश्न अनुभाग के माध्यम से पढ़ने के साथ काम करेगा


9
इस चर्चा में देर से, लेकिन आप आइटमों के क्रम को कैसे सुनिश्चित करेंगे कि आपके द्वारा सरणी में प्रदान की गई वस्तुओं के क्रम से मेल खाता है? जब तक आप किसी प्रकार का उल्लेख नहीं करते हैं, तब तक दस्तावेजों को किसी भी क्रम में बाहर आने की गारंटी नहीं है। यदि आप चाहते हैं कि आप उन्हें उसी क्रम में क्रमबद्ध करें जिसे आप उन्हें सरणी में सूचीबद्ध करते हैं (जैसे ... 000c, ... 000d, ... 000e)?
केविन

7
यह किसी कारण से काम नहीं आया। मुझे डॉक्स का एक खाली ऐरे मिला है
chovy

2
@chovy उन्हें स्ट्रिंग्स पास करने के बजाय पहले ऑब्जेक्ट्स में परिवर्तित करने का प्रयास करें
जॉर्जी हिस्टेरोज़ोव

@GeorgiHristozov मैं एक कस्टम आईडी जनरेटर का उपयोग कर रहा हूँ ... क्या ObjectId में कनवर्ट करना अभी भी काम कर रहा है? (मोंगोज़ + शारिड)

1
@Schybo कि बिल्कुल कोई फर्क नहीं पड़ता। { _id : 5 }के रूप में ही है { '_id' : 5 }
रोहिणी

27

Ids ऑब्जेक्ट आईडी का सरणी है:

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

कॉलबैक के साथ Mongoose का उपयोग करना:

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

Async फ़ंक्शन के साथ Mongoose का उपयोग करना:

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

मॉडल को अपने वास्तविक मॉडल के साथ बदलना न भूलें।


यह स्वीकृत उत्तर होना चाहिए क्योंकि यह सबसे पुराना और सुसंगत है। आपको स्वीकार किए गए उत्तर के रूप में आईडी को ऑब्जेक्टआईड में परिवर्तित नहीं करना है, और यह मैंगोज़ोज़ अनिवार्य शैली के प्रश्नों का उपयोग करता है । धन्यवाद btw!
जवी मरज़ान

यह एक बहुत ही साफ और अपडेटेड तरीका है, अगर आपको कोई आपत्ति नहीं है, तो मैं कुछ सवाल पूछना चाहूंगा, अगर मेरे पास 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

दोनों नोड .js और MongoChef मुझे ObjectId में बदलने के लिए मजबूर करते हैं। यह वह है जो मैं DB से उपयोगकर्ताओं की एक सूची को हथियाने और कुछ गुणों को लाने के लिए उपयोग करता हूं। लाइन 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
userIds = _.map (सूची, फ़ंक्शन (userId) {वापसी mongoose.Types.ObjectId (userId)};
माइकल ड्रेपर

1
मुझे 4.5.9 के मानगो का उपयोग करके ऑब्जेक्ट में कनवर्ट नहीं करना था।
फ्लोरियन वेंडेलबोर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.