यहां आपके कोड में कुछ चीजें गलत हैं। सबसे पहले और सबसे महत्वपूर्ण बात यह है कि आप अभी एक "async" वातावरण में चल रहे हैं और आपको कुछ चीजों को करने के तरीके के बारे में सोच बदलने की जरूरत है।
आपका पिछला PHP कोड "ब्लॉकिंग" है, जिसका अर्थ है कि कोड की अगली पंक्ति पर जाने से पहले कोड की प्रत्येक पंक्ति को पूरा करना होगा। इसमें डेटाबेस सर्वर द्वारा अपडेट करने और प्रतिक्रिया वापस करने की प्रतीक्षा करना शामिल है।
आप बुनियादी नियंत्रण लूप का उपयोग उनके अंदर के कार्यों के साथ नहीं कर सकते हैं जो अतुल्यकालिक रूप से प्रदर्शन करते हैं। इसके बजाय आपको कुछ ऐसा चाहिए जो लूप के अगले पुनरावृत्ति को कॉल कर सके (या कम से कम सिग्नल कि एक पुनरावृत्ति पूर्ण हो गया है) एक बार एसिंक्रोनस फ़ंक्शन "अपडेट" वास्तव में परिणाम लौटाता है।
यहां दूसरा बिंदु यह है कि "कुछ भी अपडेट नहीं किया गया" क्योंकि आपने फ़ंक्शन को यह नहीं बताया कि क्या अपडेट करना है या मिलान किए गए दस्तावेज़ को किसके साथ अपडेट करना है।
निम्नलिखित आपके मूल PHP लिस्टिंग के अनुरूप है, लेकिन "async" विधियों के लिए समायोजित भी async.eachSeries
लूप नियंत्रण के लिए async
से
पुस्तकालय:
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename; // just remove the key rather than re-construct
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
function(err,numAffected) {
console.log( numAfftected ); // tells you how many are updated or nothing
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
.findOneAndUpdate()
इसके बजाय कमांड उस दस्तावेज़ को लौटाता है जिसे संशोधित किया गया था और संशोधनों के साथ केवल तभी जब आप उनसे { "new": true }
मांगते हैं
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename;
OutAccept.findOneAndUpdate(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
{ "new": true },
function(err,doc) {
console.log( doc ); // shows the modified document
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
यदि आप एक साथ कई सरणी तत्व जोड़ना चाहते हैं, या यदि आपके पास सीधे एक सरणी में एक भी तत्व है तो $each
संशोधक से $push
:
var inventor = [
{
"ean": "2",
"name": "name2",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
},
{
"ean": "1",
"name": "name1",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
}
];
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": { "$each": inventar } } },
function(err,numAffected) {
// work in here
}
);