अद्यतन क्वेरी में नेस्टेड दस्तावेज़ों में 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
चेक करें पूछताछ की स्थिति - अद्यतन भाग, स्थिति की जांच करें,
- अगर
from
messages
. में पाया गया सरणी तब:$map
messages
. के लूप को पुनरावृत्त करने के लिए सरणी और स्थिति की जाँच करें यदि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 }
)