2012-07-06 10 views
9

में एक एम्बेडेड सूची का पता कर मैं अपने OrientDB डेटाबेस में एक दस्तावेज है मोटे तौर पर इस तरह की एक संरचना के साथ:, (संस्करण 1.0.1) OrientDB

{ 
    "timestamp": "...", 
    "duration": 665, 
    "testcases": [ 
     { 
      "testName": "test01", 
      "type": "ignore", 
      "filename": "tests/test1.js" 
     }, 
     { 
      "iterations": 1, 
      "runningTime": 45, 
      "testName": "test02", 
      "type": "pass", 
      "filename": "tests/test1.js" 
     }, 
     ... 
     { 
      "testName": "test05", 
      "type": "ignore", 
      "filename": "tests/test1.js" 
     } 
    ] 
} 

मैं पूरी सूची भर में कैसे क्वेरी कर सकता है, जैसे। अगर मैं उन सभी दस्तावेजों को ढूंढना चाहता हूं जिनमें "अनदेखा" प्रकार के साथ टेस्टकेस है?

मैं निम्न क्वेरी

select from testresult where testcases['type'] = 'ignore' 

का प्रयास किया है, लेकिन यह एक NumberFormatException का परिणाम है।

select from testresult where testcases[0]['type'] = 'ignore' 

काम करता है, लेकिन स्पष्ट रूप से केवल प्रत्येक दस्तावेज़ के पहले सूची तत्व को देखता है।

select from testresult where testcases contains(type = 'ignore') 

कोई परिणाम नहीं प्रदान करता है, लेकिन क्वेरी को मान्य के रूप में स्वीकार किया जाता है।

अद्यतन: , के रूप में इरादा अगर testcases अलग दस्तावेज़ के रूप में के बजाय एक एम्बेडेड सूची के रूप में जमा हो जाती है निम्न क्वेरी काम करता है।

select from testresult where testcases contains (type = 'ignore') 
+0

मेरे पास वही समस्या थी जो आपने किया था। आप प्रश्न में अपना अपडेट पोस्ट कर सकते हैं और इसे स्वीकार कर सकते हैं। यही वह था जिसे मैं ढूंढ रहा था। –

+0

@ डेविड लैबर्ज: सुझाव के लिए धन्यवाद। सवाल इतना पुराना है कि मैं स्पष्ट रूप से इसके संदर्भ को पूरी तरह से याद नहीं करता, इसलिए मैं उस युद्धाभ्यास के बारे में थोड़ा असहज महसूस करूंगा। मुझे यह भी एहसास है कि कम से कम ओरिएंट डीबी के दस्तावेज के अनुसार मेरा प्रारंभिक दृष्टिकोण काम करना चाहिए, इसलिए लोगों को उपरोक्त में अपने डेटाबेस को पुन: स्थापित करने के लिए प्रोत्साहित करना गलत लगेगा। – Henrik

उत्तर

7

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं एक ही समस्या थी और सिर्फ एक जवाब यहाँ पर stubled: https://www.mail-archive.com/[email protected]/msg00662.html

निम्नलिखित काम करना चाहिए। यह मेरे बहुत ही समान उपयोग मामले में करता है।

select from testresult where 'ignore' in testcases.type 
0

प्रयास करें

select from testresult where testcases traverse (type = 'ignore') 

चेक पार ऑपरेटर (https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4) जानते हैं कि कैसे fetchplan उपयोग करने के लिए या सिर्फ बाद "कहाँ" किसी भी डाल() testcases के बजाय करने के लिए।

उदाहरण के लिए हमारे पास देश नामक एक वर्ग है जिसमें इसके कुछ आईएसओ कोड के साथ एक एम्बेडेडलिस्ट संपत्ति है। हम निम्न क्वेरी का प्रयास करते हैं:

select name,description,isoCodes,status from Country where isoCodes traverse (value = 'GB' OR value = 'IT') 

Orientdb बाकी इंटरफेस प्रदान करता है:

{ 
    "result": [{ 
     "@type": "d", "@version": 0, 
"name": "Italy", 
    "isoCodes": [ 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A2", 
    "value": "IT" 
     }, 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A3", 
    "value": "ITA" 
     }], 
    "status": [ 
    { 
     "@type": "d", "@version": 0, 
    "status": "1", 
    "startingDate": "2012-04-24" 
     }] 
    }, { 
     "@type": "d", "@version": 0, 
"name": "United Kingdom", 
    "isoCodes": [ 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A2", 
    "value": "GB" 
     }, 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A3", 
    "value": "GBR" 
     }], 
    "status": [ 
    { 
     "@type": "d", "@version": 0, 
    "status": "1", 
    "startingDate": "2012-04-24" 
     }] 
    } 
    ] 
} 

आशा है कि यह मदद करता है !!।

सम्मान।

+1

आपके उत्तर के लिए धन्यवाद। दुर्भाग्य से मेरी स्थिति में सुधार नहीं हुआ। सुझाई गई क्वेरी पूरी तरह से काम करती है जब तक कि एम्बेडेड सूची में अन्य दस्तावेजों के लिंक शामिल होते हैं, लेकिन सूची में ऑब्जेक्ट्स केवल मूल्यों के साथ कोई परिणाम नहीं देते हैं, यानी। जब मैंने अपना प्रश्न अपडेट किया तो वही स्थिति मैं पहुंची थी। क्या आप मर चुके हैं-निश्चित हैं कि आपके आईएसओकोड गुण आपके डेटाबेस में अलग-अलग दस्तावेज़ नहीं हैं? – Henrik

1

मैं इसी तरह की समस्या है और साथ अंत:

select * from testresult 
    let $tmp = (select from 
    (select expand(testcases) from testresult) 
    where 
    value.type = 'ignore') 
where 
    testcases in $tmp.value 

यह आप सभी testresult दस्तावेजों है कि कम से कम एक testcase किस प्रकार की अनदेखी होता है दे देंगे। यह क्वेरी एम्बेडेड सूचियों पर काम करती है। देखभाल करें कि फ़ंक्शन का विस्तार OrientDB> = 1.4.0 में उपलब्ध है।

भीतरी क्वेरी:

select from (select expand(testcases) from testresult) where value.type='ignore' 

= एक प्रकार के साथ ही विभिन्न testcases चुनें 'उपेक्षा'। परिणाम टेस्टकेस हैं। पूरा दस्तावेज रखने के लिए हम उन टेस्टकेस से मेल खाते हैं जिनमें प्रत्येक दस्तावेज़ में शामिल है ($ tmp.value में testcases)।

मुझे नहीं पता कि एम्बेडेड सूची पूछने का एक आसान तरीका है या नहीं ...

संबंधित मुद्दे