आप जो खोज रहे हैं वह है स्थितिगत $
ऑपरेटर और "प्रक्षेपण"। एकल फ़ील्ड के लिए आपको "डॉट नोटेशन" का उपयोग करके आवश्यक सरणी तत्व से मिलान करने की आवश्यकता है, एक से अधिक फ़ील्ड उपयोग के लिए $elemMatch
:
db.products.find(
{ "items.date": "31.08.2014" },
{ "shop": 1, "name":1, "items.$": 1 }
)
या $elemMatch
एक से अधिक मेल खाने वाले फ़ील्ड के लिए:
db.products.find(
{ "items": {
"$elemMatch": { "date": "31.08.2014", "purchasePrice": 1 }
}},
{ "shop": 1, "name":1, "items.$": 1 }
)
ये केवल एक सरणी तत्व के लिए काम करते हैं और केवल एक ही लौटाया जाएगा। यदि आप चाहते हैं कि आपकी शर्तों से एक से अधिक सरणी तत्व लौटाए जाएं तो आपको एकत्रीकरण ढांचे के साथ अधिक उन्नत प्रबंधन की आवश्यकता होगी।
db.products.aggregate([
{ "$match": { "items.date": "31.08.2014" } },
{ "$unwind": "$items" },
{ "$match": { "items.date": "31.08.2014" } },
{ "$group": {
"_id": "$_id",
"shop": { "$first": "$shop" },
"name": { "$first": "$name" },
"items": { "$push": "$items" }
}}
])
या संभवतः मोंगोडीबी 2.6 के बाद से छोटे/तेज रूप में जहां आपके आइटम की सरणी में अद्वितीय प्रविष्टियां हैं:
db.products.aggregate([
{ "$match": { "items.date": "31.08.2014" } },
{ "$project": {
"shop": 1,
"name": 1,
"items": {
"$setDifference": [
{ "$map": {
"input": "$items",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.date", "31.08.2014" ] },
"$$el",
false
]
}
}},
[false]
]
}
}}
])
या संभवतः $redact
के साथ
, लेकिन थोड़ा सा काल्पनिक:
db.products.aggregate([
{ "$match": { "items.date": "31.08.2014" } },
{ "$redact": {
"$cond": [
{ "$eq": [ { "$ifNull": [ "$date", "31.08.2014" ] }, "31.08.2014" ] },
"$$DESCEND",
"$$PRUNE"
]
}}
])
अधिक आधुनिक, आप $filter
. का उपयोग करेंगे :
db.products.aggregate([
{ "$match": { "items.date": "31.08.2014" } },
{ "$addFields": {
"items": {
"input": "$items",
"cond": { "$eq": [ "$$this.date", "31.08.2014" ] }
}
}}
])
और कई शर्तों के साथ, $elemMatch
और $and
$filter
. के भीतर :
db.products.aggregate([
{ "$match": {
"$elemMatch": { "date": "31.08.2014", "purchasePrice": 1 }
}},
{ "$addFields": {
"items": {
"input": "$items",
"cond": {
"$and": [
{ "$eq": [ "$$this.date", "31.08.2014" ] },
{ "$eq": [ "$$this.purchasePrice", 1 ] }
]
}
}
}}
])
तो यह सिर्फ इस बात पर निर्भर करता है कि क्या आप हमेशा एक ही तत्व से मेल खाने की उम्मीद करते हैं या कई तत्वों से, और फिर कौन सा दृष्टिकोण बेहतर है। लेकिन जहां संभव हो .find()
विधि आम तौर पर तेज़ होगी क्योंकि इसमें अन्य परिचालनों के ऊपरी हिस्से की कमी होती है, जो कि अंतिम रूपों में बिल्कुल पीछे नहीं रहते हैं।
एक साइड नोट के रूप में, आपकी "तारीखों" को तार के रूप में दर्शाया जाता है जो आगे बढ़ने का एक बहुत अच्छा विचार नहीं है। इन्हें उचित दिनांक में बदलने पर विचार करें ऑब्जेक्ट प्रकार, जो भविष्य में आपकी बहुत मदद करेंगे।