आप चीजों को कैसे संभालना चाहते हैं, इसके आधार पर आपके पास यहां दो वास्तविक विकल्प हैं:
-
upert का उपयोग करें मोंगोडीबी की कार्यक्षमता अनिवार्य रूप से "लुकअप" करने के लिए यदि कुंजी डेटा मौजूद है। यदि नहीं तो आप केवल
$setOnInsert
और वह किसी और चीज को नहीं छूएगा। -
थोक में "अनियंत्रित" संचालन का प्रयोग करें। अपडेट का पूरा बैच जारी रहेगा, भले ही कोई त्रुटि लौटा दी गई हो, लेकिन त्रुटि रिपोर्ट बस यही है, और जो कुछ भी त्रुटि नहीं है, वह किया जाएगा।
पूरा उदाहरण:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var testSchema = new Schema({
"_id": Number,
"name": String
},{ "_id": false });
var Test = mongoose.model('Test',testSchema,'test');
mongoose.connect('mongodb://localhost/test');
var data = [
{ "_id": 1, "name": "One" },
{ "_id": 1, "name": "Another" },
{ "_id": 2, "name": "Two" }
];
async.series(
[
// Start fresh
function(callback) {
Test.remove({},callback);
},
// Ordered will fail on error. Upserts never fail!
function(callback) {
var bulk = Test.collection.initializeOrderedBulkOp();
data.forEach(function(item) {
bulk.find({ "_id": item._id }).upsert().updateOne({
"$setOnInsert": { "name": item.name }
});
});
bulk.execute(callback);
},
// All as expected
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
},
// Start again
function(callback) {
Test.remove({},callback);
},
// Unordered will just continue on error and record an error
function(callback) {
var bulk = Test.collection.initializeUnorderedBulkOp();
data.forEach(function(item) {
bulk.insert(item);
});
bulk.execute(function(err,result) {
callback(); // so what! Could not care about errors
});
},
// Still processed the whole batch
function(callback) {
Test.find().exec(function(err,docs) {
console.log(docs)
callback(err);
});
}
],
function(err) {
if (err) throw err;
mongoose.disconnect();
}
);
ध्यान दें कि वर्तमान ड्राइवरों में "बदली गई कार्रवाई" .execute()
पर परिणाम प्रतिक्रिया है होगा फेंकने के लिए एक त्रुटि वस्तु लौटाएं, जहां पिछले रिलीज ने "अन-आर्डर्ड" संचालन के साथ ऐसा नहीं किया था।
इससे यह अनिवार्य हो जाता है कि आपका कोड कभी भी err
. पर निर्भर न हो अकेले लौटा, और आपको लौटा हुआ result
इसके बजाय त्रुटियों के पूर्ण वर्गीकरण के लिए।
फिर भी, जब अनियंत्रित होता है तो बैच अंत तक जारी रहता है, चाहे कितनी भी त्रुटियाँ क्यों न हों। जो चीजें कोई त्रुटि नहीं हैं, वे सामान्य रूप से की जाएंगी।
यह वास्तव में "अनुक्रम महत्वपूर्ण है" के लिए नीचे आता है। यदि ऐसा है, तो आपको "आदेशित" संचालन की आवश्यकता है और आप केवल "अप्सर्ट्स" का उपयोग करके डुप्लिकेट कुंजियों से बच सकते हैं। अन्यथा "अनियंत्रित" का उपयोग करें, लेकिन त्रुटि रिटर्न के बारे में जागरूक रहें और उनका वास्तव में क्या मतलब है।
साथ ही, .collection
. का उपयोग करते समय "बल्क" संचालन को सक्षम करने के लिए बेस ड्राइवर से अंतर्निहित संग्रह ऑब्जेक्ट प्राप्त करने के लिए, फिर हमेशा सुनिश्चित करें कि या तो "कुछ" नेवला विधि को हमेशा पहले कहा गया है।
इसके बिना, मूल ड्राइवर विधियों के साथ डेटाबेस के लिए कोई गारंटीकृत कनेक्शन नहीं है क्योंकि इसे नेवला विधियों के लिए संभाला जाता है, इसलिए कोई कनेक्शन नहीं होने के कारण ऑपरेशन विफल हो जाएगा।
एक नेवला विधि को पहले "फायरिंग" करने का विकल्प, कनेक्शन के लिए अपने ऐप लॉजिक को इवेंट श्रोता में लपेटना है:
mongoose.connection.on("open",function(err) {
// app logic in here
})