धन्यवाद के लिए नमूना डेटा । मेरा जवाब होगा एक कच्चे MQL समाधान है, न कि एक नेवला समाधान है, तो कुछ अनुवाद की आवश्यकता होगी ।
मैं में सक्षम था सम्मिलित करने के लिए, दो दस्तावेजों के आधार पर अपनी टिप्पणी को अपनी पोस्ट में. मैं बदलने के लिए किया था ObjectId के दो में से एक नमूना दस्तावेजों क्योंकि अपने नमूने एक ही था प्राथमिक कुंजी मान और किया गया था पैदा करने के लिए एक डुप्लिकेट कुंजी अपवाद नहीं है ।
सम्मिलित नमूना डेटा
db.CallerTraces.insert(
{
"_id": ObjectId("6175e7ecc62cff004462d4a6"),
"traces": [
[
ObjectId("6175e7ecc62cff004462d4a4")
]
],
"caller_address": "0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990"
})
db.CallerTraces.insert(
{
"_id": ObjectId("6175e7ecc62cff004462d4a7"),
"traces": [
[
ObjectId("6175e7ecc62cff004462d4a4"),
ObjectId("6175e7ecc62cff004462d4a4")
],
[
ObjectId("6175e7ecc62cff004462d4a4")
]
],
"caller_address": "0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990"
})
अगर मैं खोजने के लिए चाहते हैं के रिकॉर्ड की तुलना में अधिक होने 0 आइटम सरणी में traces
मैं जारी कर सकते हैं निम्नलिखित:
खोजें अधिक शून्य से निशान
db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 0 ] } })
यह देता है निम्नलिखित:
Enterprise replSet [primary] barrydb> db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 0 ] } })
[
{
_id: ObjectId("6175e7ecc62cff004462d4a6"),
traces: [ [ ObjectId("6175e7ecc62cff004462d4a4") ] ],
caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
},
{
_id: ObjectId("6175e7ecc62cff004462d4a7"),
traces: [
[
ObjectId("6175e7ecc62cff004462d4a4"),
ObjectId("6175e7ecc62cff004462d4a4")
],
[ ObjectId("6175e7ecc62cff004462d4a4") ]
],
caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
}
]
खोजें अधिक से अधिक 1 का पता लगाने
इसके बजाय अगर मैं खोजने के लिए चाहते हैं एक से अधिक का पता लगाने मैं बस बदल क्वेरी थोड़ा:
db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 1 ] } })
... और इस रिटर्न के साथ निम्न परिणाम:
Enterprise replSet [primary] barrydb> db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 1 ] } })
[
{
_id: ObjectId("6175e7ecc62cff004462d4a7"),
traces: [
[
ObjectId("6175e7ecc62cff004462d4a4"),
ObjectId("6175e7ecc62cff004462d4a4")
],
[ ObjectId("6175e7ecc62cff004462d4a4") ]
],
caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
}
]
निष्कर्ष
का प्रयास करते समय का मूल्यांकन करने के लिए सरणी की लंबाई के भीतर क्वेरी प्रोसेसर हम का चुनाव करना चाहिए का उपयोग करने के लिए $eval
विकल्प के रूप में वाक्य रचना के लिए MQL पर विचार नहीं करता है अपने मामले का उपयोग करें. के $eval
कुछ की एक पकड़ सभी विकल्प के लिए फिट नहीं है कि चीजों में अच्छी तरह से MQL ढांचे.
अद्यतन #1
सेशन शुरू की अतिरिक्त आवश्यकताओं । बल्कि देखो की तुलना में गणना की सरणी, हम पर विचार करना चाहिए गिनती सरणी की सरणी के भीतर (नेस्टेड आंतरिक सरणी). के बाद से खोजें() विधि के साथ $expr नहीं कर सकता का मूल्यांकन नेस्टेड सारणियों हम चाहिए का उपयोग करने के बजाय एकत्रीकरण ढांचे और तनाव कम बाहरी सरणी. इस उदाहरण स्टोर मूल रूप में एक नया क्षेत्र कहा जाता है original
तो बदलता रूट के बाद सभी मूल्यांकन पूरा हो गया है । के बाद से तनाव में परिणाम कर सकते हैं डुप्लिकेट पाइप लाइन में हम को अंतिम रूप देने के साथ एक $समूह को दबाने के लिए डुप्लिकेट ।
समाधान
db.CallerTraces.aggregate([
{
$addFields: {
"original._id": "$_id",
"original.traces": "$traces",
"original.caller_address": "$caller_address"
}
},
{
$unwind: "$traces"
},
{
$match: { $expr: { $gt: [ { $size: "$traces" }, 1 ] } }
},
{
$replaceRoot: { newRoot: "$original" }
},
{
$group:
{
_id: "$_id",
traces: { "$first": "$traces" },
caller_address: { "$first": "$caller_address" }
}
}
])