आपको $set
स्थितिगत $
के साथ ऑपरेटर
दोनों मेल खाने वाली कुंजियों को अपडेट करने के लिए।
मैं वस्तु हेरफेर का आधुनिक ES6 तरीका पसंद करता हूं:
let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };
let update = [
{ 'store.products._id': params._id },
{ "$set": Object.keys(params).filter(k => k != '_id')
.reduce((acc,curr) =>
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
{ })
}
];
User.update(...update,callback);
जो MongoDB को कॉल का उत्पादन करेगा (mongoose.set('debug', true)
के साथ ) चालू है इसलिए हमें अनुरोध दिखाई देता है:
जहां मूल रूप से आप अपना इनपुट params
take लेते हैं और _id
की आपूर्ति करें "क्वेरी" के पहले तर्क के रूप में:
{ 'store.products._id': params._id },
बाकी ऑब्जेक्ट से के माध्यम से "कुंजी" लेता है। Object.keys
जो एक "सरणी" बनाता है जिसे हम Array.filter()
और फिर Array पर पास करें। कम करें
उन कुंजियों को ऑब्जेक्ट
. में बदलने के लिए ।
.reduce() के अंदर
हम Object.assign()<को कॉल करते हैं /कोड>
जो इस रूप में उत्पन्न दी गई कुंजियों के साथ वस्तुओं को "विलय" करता है:
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
ES6 कुंजी असाइनमेंट सिंटैक्स []:
जो ऑब्जेक्ट लिटरल में वेरिएबल नामों की अनुमति देता है।
परिणामी "मर्ज" ऑब्जेक्ट को "रूट" ऑब्जेक्ट को असाइन करने के लिए वापस पास किया जाता है जहां $set
अद्यतन की कुंजी के लिए उपयोग किया जाता है, इसलिए "जनरेटेड" कुंजियाँ अब उसी की संतान हैं।
मैं पूरी तरह से डिबगिंग उद्देश्यों के लिए तर्कों के लिए एक सरणी का उपयोग करता हूं, लेकिन फिर वह वास्तविक .update()
पर क्लीनर सिंटैक्स की भी अनुमति देता है। "स्प्रेड" ...
. का उपयोग करके तर्क देने के लिए ऑपरेटर:
User.update(...update,callback);
स्वच्छ और सरल, और कुछ जावास्क्रिप्ट तकनीकें जो आपको वस्तु और सरणी हेरफेर के लिए सीखनी चाहिए। अधिकतर चूंकि मोंगोडीबी क्वेरी डीएसएल मूल रूप से "ऑब्जेक्ट्स" और "एरेज़" है। इसलिए उनमें हेरफेर करना सीखें।