संपादित करें
इस तरह की संरचना होना:
{
"_id" : ObjectId("575e4c8731dcfb59af388e1d"),
"name" : "Maria",
"providers" : [
{
"type" : "facebook",
"data" : "fb.com",
"privacy" : true
},
{
"type" : "twitter",
"data" : "twitter.com",
"privacy" : false
},
{
"type" : "google",
"data" : "google.com",
"privacy" : true
},
{
"type" : "phno",
"data" : "+1-1289741824124",
"privacy" : true
}
]
}
इस तरह की क्वेरी के साथ:
db.maria.aggregate([{
$project : {
_id : 1,
name : 1,
"providers" : {
$filter : {
input : "$providers",
as : "p",
cond : {
$eq : ["$$p.privacy", true]
}
}
}
}
}
])
])
हम गतिशील आउटपुट प्राप्त कर रहे हैं, और हमें प्रदाता के नाम पर ध्यान देने की आवश्यकता नहीं है क्योंकि यह सामान्य संरचना द्वारा कवर किया गया है
{
"providers" : [
{
"type" : "facebook",
"data" : "fb.com",
"privacy" : true
},
{
"type" : "google",
"data" : "google.com",
"privacy" : true
},
{
"type" : "phno",
"data" : "+1-1289741824124",
"privacy" : true
}
],
"name" : "Maria"
}
संपादन की समाप्ति
जिस तरह से आप इसे प्राप्त कर सकते हैं वह एकत्रीकरण ढांचे का उपयोग कर रहा है। चूंकि हमारे पास प्रत्येक क्षेत्र के लिए एक सरणी है, हमें पहले इसे खोलना होगा, फिर हम $project
का उपयोग कर सकते हैं फ़ील्ड मान या बस शून्य सेट करने के लिए। जैसा कि यह एक साधारण प्रश्न की तरह दिखता है, यह थोड़ी परेशानी दे सकता है। जिस तरह से हम सुधार कर सकते हैं वह है दस्तावेज़ संरचना को बदलना, प्रदाताओं की एक सरणी और सरल प्रदाता टाइप फ़ील्ड रखना।
नीचे एकत्रीकरण चरण:
db.maria.find()
var unwindFb = {
$unwind : "$facebook"
}
var unwindtw = {
$unwind : "$twitter"
}
var unwindgo = {
$unwind : "$google"
}
var unwindph = {
$unwind : "$phno"
}
var project = {
$project : {
_id : 1,
name : 1, // list other fields here
facebook : {
$cond : {
if : {
$gte : ["$facebook.privacy", true]
},
then : [{
data : "$facebook.data",
privacy : "$facebook.privacy"
}
],
else : null
}
},
twitter : {
$cond : {
if : {
$gte : ["$twitter.privacy", true]
},
then : [{
data : "$twitter.data",
privacy : "$twitter.privacy"
}
],
else : null
}
},
google : {
$cond : {
if : {
$gte : ["$google.privacy", true]
},
then : [{
data : "$google.data",
privacy : "$google.privacy"
}
],
else : null
}
},
phno : {
$cond : {
if : {
$gte : ["$phno.privacy", true]
},
then : [{
data : "$phno.data",
privacy : "$phno.privacy"
}
],
else : null
}
}
}
}
db.maria.aggregate([unwindFb, unwindtw, unwindgo, unwindph, project])
तब आउटपुट इस तरह दिखता है:
{
"_id" : ObjectId("575df49d31dcfb59af388e1a"),
"name" : "Maria",
"facebook" : [
{
"data" : "fb.com",
"privacy" : true
}
],
"twitter" : null,
"google" : [
{
"data" : "google.com",
"privacy" : true
}
],
"phno" : [
{
"data" : "+1-1289741824124",
"privacy" : true
}
]
}