आप वास्तव में अपडेट . के साथ अपनी समस्या का समाधान कर सकते हैं विधि, लेकिन यदि आप MongoDB 4.2 या बाद के संस्करण का उपयोग कर रहे हैं तो आपको इसे एक अलग तरीके से करना होगा। दूसरा पैरामीटर $set
. हो सकता है ऑपरेशन जिसे आप करना चाहते हैं या एक aggregation
पाइपलाइन। बाद में उपयोग करने से आपको डेटा को आकार देने में अधिक स्वतंत्रता मिलती है। इस तरह आप अपनी समस्या का समाधान कर सकते हैं, मैं इसके बाद विश्लेषण करूंगा:
db.collection.update({
"cards.advanced.unit": 2
},
[
{
$set: {
"cards.advanced": {
$map: {
input: "$cards.advanced",
as: "adv",
in: {
cards: {
$map: {
input: "$$adv.cards",
as: "advcard",
in: {
$cond: [
{
$eq: [
"$$advcard.id",
"main-2-1"
]
},
{
title: "this is a NEW updated card",
id: "$$advcard.id"
},
"$$advcard"
]
}
}
},
unit: "$$adv.unit"
}
}
}
}
}
],
{
new: true,
});
सबसे पहले अपडेट . का उपयोग करें तीन पैरामीटर पास करने की विधि:
- फ़िल्टर क्वेरी
- एकत्रीकरण पाइपलाइन
- विकल्प। यहाँ मैंने अभी-अभी
new: true
. का उपयोग किया है अपडेट किए गए दस्तावेज़ को वापस करने और परीक्षण को आसान बनाने के लिए।
यह संरचना है:
db.collection.update({
"cards.advanced.unit": 2
},
[
// Pipeline
],
{
new: true,
});
पाइपलाइन के अंदर हमें केवल एक चरण की आवश्यकता है, $set
संपत्ति को बदलने के लिए advanced
एक सरणी के साथ हम बनाएंगे।
...
[
{
$set: {
"cards.advanced": {
// Our first map
}
}
}
]
...
हम सबसे पहले advanced
. को मैप करते हैं बाद में नेस्टेड कार्ड सरणी को मैप करने में सक्षम होने के लिए सरणी:
...
[
{
$set: {
"cards.advanced": {
$map: {
input: "$cards.advanced",
as: "adv",
in: {
// Here we will map the nested array
}
}
}
}
}
]
...
हम पहले मानचित्र पर घोषित चर का उपयोग करते हैं और जिसमें उन्नत सरणी वर्तमान आइटम मैप किया जा रहा है ( adv
) नेस्टेड "कार्ड्स" ऐरे ( $$adv.cards
तक पहुँचने और मैप करने के लिए) ):
...
[
{
$set: {
"cards.advanced": {
$map: {
input: "$cards.advanced",
as: "adv",
in: {
cards: {
$map: {
input: "$$adv.cards",
as: "advcard",
in: {
// We place our condition to check for the chosen card here
}
}
},
unit: "$$adv.unit",
}
}
}
}
}
]
...
अंत में हम जांचते हैं कि क्या वर्तमान कार्ड आईडी खोजी जा रही आईडी के बराबर है $eq: [ "$$advcard.id", "main-2-1" ]
और नया कार्ड वापस करें यदि यह मेल खाता है या वर्तमान कार्ड:
...
{
$cond: [
{
$eq: [
"$$advcard.id",
"main-2-1"
]
},
{
title: "this is a NEW updated card",
id: "$$advcard"
},
"$$advcard"
]
}
...
जो वर्णित है उसका एक कार्यशील उदाहरण यहां दिया गया है:https://mongoplayground.net/p/xivZGNeD8ng