मुझे पता है कि यह प्रश्न पुराना है, लेकिन एक इसी तरह के नए प्रश्न का उत्तर देने के बाद मैंने इसे Google पर पाया। . तो मैंने सोचा कि यह वही इलाज के लायक है।
आप $where के प्रदर्शन हिट से बच सकते हैं aggregate का इस्तेमाल करके इसके बजाय:
db.example.aggregate([
// Use an index, which $where cannot to narrow down
{$match: { "comments.by": "Abe" }},
// De-normalize the Array
{$unwind: "$comments"},
// The order of the array is maintained, so just look for the $last by _id
{$group: { _id: "$_id", comments: {$last: "$comment"} }},
// Match only where that $last comment by `by.Abe`
{$match: { "comments.by": "Abe" }},
// Retain the original _id order
{$sort: { _id: 1 }}
])
और वह $कहां . के आसपास बजना चाहिए चूंकि हम के पास . के दस्तावेज़ों को सीमित करने में सक्षम थे पहली जगह में "अबे" द्वारा एक टिप्पणी। जैसा कि चेतावनी दी गई है, $कहां संग्रह में प्रत्येक दस्तावेज़ का परीक्षण करने जा रहा है और कभी भी किसी अनुक्रमणिका का उपयोग नहीं करेगा, भले ही कोई उपयोग करने के लिए हो।
बेशक, आप यहां वर्णित तकनीक
का उपयोग करके भी मूल दस्तावेज़ को बनाए रख सकते हैं। साथ ही, इसलिए सब कुछ ठीक उसी तरह काम करेगा जैसे find()
।
इसे खोजने वाले किसी भी व्यक्ति के लिए केवल विचार के लिए भोजन।
आधुनिक MongoDB रिलीज़ के लिए अपडेट
आधुनिक रिलीज़ में $redact
जोड़ा गया है
पाइपलाइन अभिव्यक्ति और साथ ही $arrayElemAt
(उत्तरार्द्ध 3.2 के रूप में, ताकि यहां न्यूनतम संस्करण होगा) जो संयोजन में एक तार्किक अभिव्यक्ति को $unwind
मंच:
db.example.aggregate([
{ "$match": { "comments.by": "Abe" }},
{ "$redact": {
"$cond": {
"if": {
"$eq": [
{ "$arrayElemAt": [ "$comments.by", -1 ] },
"Abe"
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
यहां तर्क तुलना की गई है जहां $arrayElemAt
सरणी की अंतिम अनुक्रमणिका प्राप्त हो रही है -1
, जो "by"
. में मानों की केवल एक सरणी में रूपांतरित हो जाता है $map
के ज़रिए प्रॉपर्टी
. यह आवश्यक पैरामीटर, "Abe"
. के विरुद्ध एकल मान की तुलना की अनुमति देता है ।
या $expr
का उपयोग करके और भी आधुनिक
MongoDB 3.6 और उच्चतर के लिए:
db.example.find({
"comments.by": "Abe",
"$expr": {
"$eq": [
{ "$arrayElemAt": [ "$comments.by", -1 ] },
"Abe"
]
}
})
यह एक सरणी के भीतर अंतिम तत्व से मेल खाने के लिए अब तक का सबसे अधिक प्रदर्शन करने वाला समाधान होगा, और वास्तव में $where
ज्यादातर मामलों में और विशेष रूप से यहाँ।