आपको .aggregate()
चाहिए
एक एकल मिलान से अधिक के लिए किसी भी सरणी सामग्री को "फ़िल्टर" करने के लिए विधि, और मूल मिलान भी बहुत सरल है क्योंकि MongoDB परवाह नहीं है कि डेटा सरणियों के भीतर है, जब तक कि निर्दिष्ट पथ सही है:पी>
db.collection.aggregate([
{ "$match": { "data.userid": 1 } },
{ "$project": {
"data": {
"$setDifference": [
{ "$map": {
"input": "$data",
"as": "el",
"in": {
"$cond": [
{ "$setIsSubset": [ [1], "$$el.userid" ] },
"$$el",
false
]
}
}},
[false]
]
}
}},
{ "$match": { "data.0": { "$exists": true } }}
])
PHP के साथ यह निम्नानुसार नोट करता है:
$collection->aggregate(array(
array( '$match' => array( "data.userid" => 1 )),
array(
'$project' => array(
'data' => array(
'$setDifference' => array(
array(
'$map' => array(
'input' => '$data',
'as' => 'el',
'in' => array(
'$cond' => array(
array( '$setIsSubset' => array(array(1),'$$el.userid') ),
'$$el',
FALSE
)
)
)
),
array(FALSE)
)
)
)
),
array( '$match' => array( 'data.0' => array( '$exists' => TRUE ) ) )
))
$map
ऑपरेटर बाहरी सरणी के प्रत्येक तत्व के निरीक्षण की अनुमति देता है और प्रत्येक तत्व को <मजबूत>$cond
टर्नरी ऑपरेशन। यह एक $setIsSubset
को प्रोसेस करता है
"आंतरिक" सरणी पर ऑपरेशन यह देखने के लिए कि क्या वास्तव में वैकल्पिक सेट में मानों में से एक है (इस मामले में [1]
) और जहां true
मूल्यांकन किया जाता है तो तत्व वापस कर दिया जाता है या अन्यथा false
।
$setDifference
की बात
उन false
को हटाना है संशोधित सरणी से मान और केवल मिलान किए गए तत्व लौटाएं। और अंत में $exists
परीक्षण यह देखने के लिए दिखता है कि बाहरी सरणी में वास्तव में कम से कम एक तत्व है और फ़िल्टरिंग के परिणामस्वरूप खाली नहीं है।
लौटाए गए दस्तावेज़ वे हैं जो मिलान की स्थिति वाले हैं और केवल सरणी तत्व हैं जो निर्दिष्ट स्थिति से मेल खाते हैं।
बेशक यहां ऑपरेटरों को सर्वर के रूप में कम से कम MongoDB 2.6 की आवश्यकता होती है (जो अब काफी पुरानी रिलीज है और कम से कम एक सलाह दी गई अपडेट है) लेकिन यदि आपके पास अभी भी एक कम संस्करण है तो आपको $unwind
और $group
:
$collection->aggregate(array(
array( '$match' => array( "data.userid" => 1 )),
array( '$unwind' => '$data' ),
array( '$match' => array( 'data.userid' => 1 )),
array(
'$group' => array(
'_id' => '$_id',
'data' => array( '$push' => '$data' )
)
)
))