अद्यतन क्वेरी में नेस्टेड दस्तावेज़ों में Upsert काम नहीं करेगा,
यदि आप इसे एक ही प्रश्न में करना चाहते हैं, तो आप अपने मामलों को संभालने के लिए एकत्रीकरण क्वेरी के साथ एक जटिल अद्यतन का प्रयास कर सकते हैं,
आइए एक उदाहरण इनपुट लें और उदाहरण के अनुसार मामला देखें,
मामला 1: यदि निर्दिष्ट किया गया है messages.from फ़ील्ड messages . में मौजूद है सरणी
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
मामला 2: अगर messages.from फ़ील्ड सरणी में मौजूद नहीं है
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
केस 3: अगर दस्तावेज़ मौजूद नहीं है
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
आपकी अंतिम क्वेरी होगी,
- केवल
toचेक करें पूछताछ की स्थिति - अद्यतन भाग, स्थिति की जांच करें,
- अगर
frommessages. में पाया गया सरणी तब:$mapmessages. के लूप को पुनरावृत्त करने के लिए सरणी और स्थिति की जाँच करें यदिfromफिर मिला वर्तमानsubMessagesनए इनपुट के साथ सरणीsubMessage$concatArrays. का उपयोग करके ,$mergeObjectsवर्तमान वस्तु को अद्यतन वस्तु के साथ मिलाने के लिए
- अन्यथा नहीं मिला तो मौजूदा
messagesमें नए संदेश ऑब्जेक्ट सरणी को संक्षिप्त करें$cocnatArrays. का उपयोग करके सरणी
- अगर
upsert: true, संग्रह में नहीं मिलने पर नया दस्तावेज़ सम्मिलित करने के लिए
db.pendingMessages.updateOne(
{ to: to },
[{
$set: {
messages: {
$cond: [
{ $in: [from, { $ifNull: ["$messages.from", []] }] },
{
$map: {
input: "$messages",
in: {
$mergeObjects: [
"$$this",
{
subMessages: {
$cond: [
{ $eq: ["$$this.from", from] },
{
$concatArrays: ["$$this.subMessages", [subMessage]]
},
"$$this.subMessages"
]
}
}
]
}
}
},
{
$concatArrays: [
{ $ifNull: ["$messages", []] },
[
{
from: from,
subMessages: [subMessage]
}
]
]
}
]
}
}
}],
{ upsert: true }
)