MongoDB एग्रीगेशन में $project और $cond का उपयोग करके डायनामिक फील्ड प्रोजेक्शन
MongoDB में जब दस्तावेज़ों में अलग-अलग फील्ड नाम हों (जैसे Marks1/Score1), तो $project के साथ $cond और $ifNull का उपयोग करके एकीकृत स्कीमा में प्रोजेक्ट करें।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo439.insertOne({
"Name" : "Chris",
"MarksInformation" : { "Marks1" : 67, "Marks2" :45, "Marks3" : 78 }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e77833abbc41e36cc3caeab") }
> db.demo439.insertOne({
"Name" : "David",
"MarksInformation" : { "Marks1" : 50, "Marks2" :57, "Marks3" : 68 }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e77833abbc41e36cc3caeac") }
> db.demo439.insertOne({
"Name" : "Bob",
"MarksInformation" : { "Score1" : 65, "Score2" :71 }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e77833bbbc41e36cc3caead") }
सभी दस्तावेज़ देखना
> db.demo439.find();
आउटपुट:
{ "_id" : ObjectId("5e77833abbc41e36cc3caeab"), "Name" : "Chris", "MarksInformation" : { "Marks1" : 67, "Marks2" : 45, "Marks3" : 78 } }
{ "_id" : ObjectId("5e77833abbc41e36cc3caeac"), "Name" : "David", "MarksInformation" : { "Marks1" : 50, "Marks2" : 57, "Marks3" : 68 } }
{ "_id" : ObjectId("5e77833bbbc41e36cc3caead"), "Name" : "Bob", "MarksInformation" : { "Score1" : 65, "Score2" : 71 } }
एकीकृत फील्ड्स (Marks1, Marks2, Marks3) में प्रोजेक्ट करना
> db.demo439.aggregate({
$project: {
"Name" : 1,
"Marks1": {
$cond: [
{ $eq:[ { $ifNull: [ "$MarksInformation.Marks1", 0 ] }, 0 ] },
{ $ifNull: [ "$MarksInformation.Score1", 0 ] },
"$MarksInformation.Marks1"
]
},
"Marks2": {
$cond: [
{ $eq:[ { $ifNull: [ "$MarksInformation.Marks2", 0 ] }, 0 ] },
{ $ifNull: [ "$MarksInformation.Score2", 0 ] },
"$MarksInformation.Marks2"
]
},
"Marks3": {
$cond: [
{ $eq:[ { $ifNull: [ "$MarksInformation.Marks3", 0] }, 0 ] },
{ $ifNull: [ "$MarksInformation.Score3", 0 ] },
"$MarksInformation.Marks3"
]
}
}
})
आउटपुट:
{ "_id" : ObjectId("5e77833abbc41e36cc3caeab"), "Name" : "Chris", "Marks1" : 67, "Marks2" : 45, "Marks3" : 78 }
{ "_id" : ObjectId("5e77833abbc41e36cc3caeac"), "Name" : "David", "Marks1" : 50, "Marks2" : 57, "Marks3" : 68 }
{ "_id" : ObjectId("5e77833bbbc41e36cc3caead"), "Name" : "Bob", "Marks1" : 65, "Marks2" : 71, "Marks3" : 0 }
लॉजिक व्याख्या:
$ifNull: ["$MarksInformation.Marks1", 0]- Marks1 मौजूद तो उसका मान, अन्यथा 0$eq: [..., 0]- यदि परिणाम 0 है (फील्ड गायब या 0)- तो
$ifNull: ["$MarksInformation.Score1", 0]उपयोग करें (फॉलबैक) - अन्यथा मूल
$MarksInformation.Marks1उपयोग करें
सरल विकल्प (MongoDB 3.6+): $switch
Marks1: {
$switch: {
branches: [
{ case: { $ne: ["$MarksInformation.Marks1", null] }, then: "$MarksInformation.Marks1" },
{ case: { $ne: ["$MarksInformation.Score1", null] }, then: "$MarksInformation.Score1" }
],
default: 0
}
}
उपयोग के मामले: स्कीमा माइग्रेशन, बहु-संस्करण डेटा, असंरचित डेटा सामान्यीकरण।