MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

Mongoose के साथ बल्क अपर्ट करने की कोशिश की जा रही है। ऐसा करने का सबसे साफ तरीका क्या है?

([email protected] , [email protected] )

TL;DR

await GasStation.collection.bulkWrite([ // <<==== use the model name
  {
    'updateOne': {
      'filter': { 'id': '<some id>' },
      'update': { '$set': { /* properties to update */ } },
      'upsert': true,  // <<==== upsert in every document
    }
  },
  /* other operations here... */
]);

लंबी कहानी:

Mongoose API खराब दस्तावेज़ीकरण के साथ संघर्ष करने के बाद , मैंने थोक अप्सर्ट . को हल किया ट्वीकिंग updateOne:{} bulkWrite() . में संचालन विधि।

कुछ गैर-दस्तावेजी बातों पर विचार करने के लिए:

// suppose:
var GasStation = mongoose.model('gasstation', gasStationsSchema);
var bulkOps = [ ];

// for ( ... each gasStation to upsert ...) {
  let gasStation = { country:'a', localId:'b', xyz:'c' };
  // [populate gasStation as needed]
  // Each document should look like this: (note the 'upsert': true)
  let upsertDoc = {
    'updateOne': {
      'filter': { 'country': gasStation.country, 'localId': gasStation.localId },
      'update': gasStation,
      'upsert': true
  }};
  bulkOps.push(upsertDoc);
// end for loop

// now bulkWrite (note the use of 'Model.collection')
GasStation.collection.bulkWrite(bulkOps)
  .then( bulkWriteOpResult => {
    console.log('BULK update OK');
    console.log(JSON.stringify(bulkWriteOpResult, null, 2));
  })
  .catch( err => {
    console.log('BULK update error');
    console.log(JSON.stringify(err, null, 2));
  });

यहाँ दो प्रमुख बातें अपूर्ण API दस्तावेज़ीकरण समस्याएँ हैं (लेखन के समय, कम से कम):

  • 'upsert': true प्रत्येक दस्तावेज़ में . यह Mongoose API () में प्रलेखित नहीं है, जो अक्सर नोड-मोंगोडब-नेटिव को संदर्भित करता है चालक। इस ड्राइवर में updateOne देख रहे हैं , आप जोड़ने के बारे में सोच सकते हैं 'options':{'upsert': true} , लेकिन, नहीं... वह नहीं चलेगा। मैंने दोनों मामलों को bulkWrite(,[options],) में जोड़ने का भी प्रयास किया तर्क, बिना किसी प्रभाव के।
  • GasStation.collection.bulkWrite() . हालांकि Mongoose bulkWrite() विधि दावा है कि इसे Model.bulkWrite() . कहा जाना चाहिए (इस मामले में, GasStation.bulkWrite() ), जो ट्रिगर करेगा MongoError: Unknown modifier: $__ . तो, Model.collection.bulkWrite() इस्तेमाल किया जाना चाहिए।

इसके अतिरिक्त, ध्यान दें:

gasStationsSchema.index({ country: 1, localId: 1 }, { unique: true });

आशा है कि यह मदद करता है।

==> संपादित करें:(नेवला 5?)

जैसा कि @JustinSmith ने देखा, $set Mongoose द्वारा जोड़ा गया ऑपरेटर अब काम नहीं कर रहा है। शायद यह नेवला 5 की वजह से है?

किसी भी स्थिति में, $set . का उपयोग करके स्पष्ट रूप से करना चाहिए:

'update': { '$set': gasStation },


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला पॉप्युलेट का उपयोग करते समय पदों की एक खाली सरणी लौटाना

  2. MongoDB $ DegreesToRadians

  3. स्वैगर (सी # के लिए स्वाशबकल) मोंगो ऑब्जेक्ट आईडी को सिंगल स्ट्रिंग के बजाय कई फ़ील्ड के रूप में दिखाता है

  4. जब तक मैं findOneAndUpdate के बाद .then res.json(...) को कॉल नहीं करता, तब तक MongoDB अपडेट क्यों नहीं होता?

  5. MongoDB ts.t निर्दिष्ट करके प्रविष्टि नहीं ढूँढ सकता (ts एक टाइमस्टैम्प प्रकार है)