आपको
. से एक त्रुटि मिलती हैdb.users.findOne(
{ username: 'test', 'kingdoms.buildings.type': 'castle' },
{ kingdoms: {$slice: [n, 1]}, 'kingdom.buildings.$': 1 }
);
क्योंकि वर्तनी की गलती है ("किंगडम.बिल्डिंग.$" को "किंगडमs होना चाहिए .builds.$").
हालाँकि, यह तरीका आपकी अपेक्षा के अनुरूप पूरा नहीं कर सकता।
$ हमेशा राज्यों . के उद्देश्य से होता है किंगडम्स.बिल्डिंग . के पथ में - पहली सरणी।
यह एक ऐसा तरीका है जो समस्या को हल करने में सक्षम होना चाहिए।
(V2.6+ आवश्यक)
db.c.aggregate([ {
$match : {
username : 'test',
'kingdoms.buildings.type' : 'castle'
}
}, {
$project : {
_id : 0,
kingdoms : 1
}
}, {
$redact : {
$cond : {
"if" : {
$or : [ {
$gt : [ "$kingdoms", [] ]
}, {
$gt : [ "$buildings", [] ]
}, {
$eq : [ "$type", "castle" ]
} ]
},
"then" : "$$DESCEND",
"else" : "$$PRUNE"
}
}
} ]).pretty();
केवल राज्यों . के पहले तत्व को आरक्षित करने के लिए ,
db.c.aggregate([ {
$match : {
username : 'test',
'kingdoms.buildings.type' : 'castle'
}
}, {
$redact : {
$cond : {
"if" : {
$or : [ {
$gt : [ "$kingdoms", [] ]
}, {
$gt : [ "$buildings", [] ]
}, {
$eq : [ "$type", "castle" ]
} ]
},
"then" : "$$DESCEND",
"else" : "$$PRUNE"
}
}
}, {
$unwind : "$kingdoms"
}, {
$group : {
_id : "$_id",
kingdom : {
$first : "$kingdoms"
}
}
}, {
$group : {
_id : "$_id",
kingdoms : {
$push : "$kingdom"
}
}
}, {
$project : {
_id : 0,
kingdoms : 1
}
} ]).pretty();