([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()
इस्तेमाल किया जाना चाहिए।
इसके अतिरिक्त, ध्यान दें:
आपको$set
. का उपयोग करने की आवश्यकता नहीं हैupdateOne.update
. में मोंगो ऑपरेटर फ़ील्ड, चूंकि नेवला अप्सर्ट के मामले में इसे संभालता है (देखें bulkWrite() टिप्पणियां उदाहरण मेंए> )।- ध्यान दें कि स्कीमा में मेरी अनूठी अनुक्रमणिका (अप्सर्ट के ठीक से काम करने के लिए आवश्यक) को इस प्रकार परिभाषित किया गया है:
gasStationsSchema.index({ country: 1, localId: 1 }, { unique: true });
आशा है कि यह मदद करता है।
==> संपादित करें:(नेवला 5?)
जैसा कि @JustinSmith ने देखा, $set
Mongoose द्वारा जोड़ा गया ऑपरेटर अब काम नहीं कर रहा है। शायद यह नेवला 5 की वजह से है?
किसी भी स्थिति में, $set
. का उपयोग करके स्पष्ट रूप से करना चाहिए:
'update': { '$set': gasStation },