Mongodb क्वेरी के आकार नेस्टेड सारणियों

0

सवाल

मैं निम्न स्कीमा:

Schema({
caller_address: {
    type: String,
    required: true,
},
traces: [[{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Call',
}]]

});

और मैं की तरह होता है पुनः प्राप्त करने के लिए केवल वस्तुओं है कि निशान के साथ कॉल की राशि की तुलना में बड़ा है एक निर्दिष्ट संख्या. अन्य शब्दों में, आकार के कम से कम एक नेस्टेड सरणी के निशान होना चाहिए की तुलना में बड़ा है एक निर्दिष्ट संख्या. मैं कोशिश कर रहा हूँ का उपयोग करने के लिए $elemMatch और $आकार, लेकिन कोई सफलता नहीं है । अब के लिए, मैं इस कोड के बारे में:

CallerTraces.find({ 'traces' : { $elemMatch: { $size : { $gt: minTraceSize } }}})

जहां minTraceSize एक पूर्णांक है.

सकता है आप लोग मेरी मदद करो? मैं वास्तव में इसे सराहना करते हैं!

arrays mongodb nested
2021-11-23 20:27:28
1

सबसे अच्छा जवाब

0

धन्यवाद के लिए नमूना डेटा । मेरा जवाब होगा एक कच्चे 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" }
        }
    }
])
2021-11-24 21:42:44

नमस्ते, धन्यवाद, आप अपने त्वरित प्रतिक्रिया के लिए! लेकिन काफी नहीं है अभी तक समस्या... मैं प्राप्त करना चाहते हैं के निशान आकार में दूसरे स्तर के घोंसले के शिकार. तो, अगर मैं: { "_id": ObjectId("6175e7ecc62cff004462d4a7"), "निशान": [ [ ObjectId("6175e7ecc62cff004462d4a4"), ObjectId("6175e7ecc62cff004462d4a4") ] ], "caller_address": "0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990" }) इस वस्तु वापस आ जाना चाहिए जब मैं सेट 2 के लिए minTraceSize चर.
Bruno Medeiros

@BrunoMedeiros - देखने के लिए कृपया अद्यतन में पोस्ट.
barrypicker

यह काम किया! बहुत बहुत धन्यवाद! =)
Bruno Medeiros

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में