2010-12-22 11 views
14

मैं इस तरह मेरे "पैरामीटर" संकलन में एक दस्तावेज़ है:मोंगोडीबी के साथ डॉक्टर ओडीएम में संदर्भित दस्तावेज़ द्वारा कैसे खोजें?

{ 
    "_id": ObjectId("4d124cef3ffcf6f410000037"), 
    "code": "color", 
    "productTypes": [ 
    { 
     "$ref": "productTypes", 
     "$id": ObjectId("4d120a2d2b8d8d3010000000"), 
     "$db": "test" 
    } 
    ] 
} 

संदर्भित दस्तावेज़ यह है:

{ 
    "_id": ObjectId("4d120a2d2b8d8d3010000000"), 
    "code": "car" 
} 

मैं "param" दस्तावेज है जो संदर्भित लाने के लिए DoctrineODM उपयोग कर रहा हूँ " उत्पाद प्रकार "कार" है। मैं इस कोड का उपयोग कर रहा हूं:

$query = $dm->createQuery('Cms\Model\Param'); 
$query->field('productTypes.code')->equals('car'); 
$result = $query->execute(); 
var_dump($result); 

लेकिन परिणाम एक खाली सरणी है। मैं यह कैसे कर सकता हूँ?

+0

क्या डेटाबेस आप कनेक्ट कर रहे? यह 'परीक्षण' या 'व्यवस्थापक' सही नहीं है? –

+0

संख्या। यह परीक्षण या व्यवस्थापक नहीं है। मैंने नाम बदल दिया। – cnkt

+0

क्या हम आपके दस्तावेज़ कक्षाएं देख सकते हैं? –

उत्तर

6

यदि आप रेफरेंसमेन या रेफरेंसऑन का उपयोग करते हैं तो आप संदर्भ दस्तावेज़ आईडी को छोड़कर किसी भी संदर्भ दस्तावेज़ फ़ील्ड से क्वेरी नहीं कर सकते हैं।

यदि आपको संदर्भित संग्रह से code पर क्वेरी की आवश्यकता है तो आपको EmbedMany का उपयोग ReferenceMany के बजाय करना चाहिए।

इस मामले में अपने दस्तावेज़ होगा:

{ 
    "_id": ObjectId("4d124cef3ffcf6f410000037"), 
    "code": "color", 
    "productTypes": [ 
    { 
     "_id": ObjectId("4d120a2d2b8d8d3010000000"), 
     "code": "car" 
    } 
    ] 
} 

और निम्न क्वेरी काम करेगा:

$query = $dm->createQuery('Cms\Model\Param'); 
$query->field('productTypes.code')->equals('car'); 
$result = $query->execute(); 
var_dump($result); 

इसके अलावा, अगर आपके ProductType कोड अद्वितीय है तो आप इसके बजाय MongoId का उपयोग कर सकते हैं इस मामले में, आप $ आईडी पर पूछ सकते हैं:

{ 
    "_id": ObjectId("4d124cef3ffcf6f410000037"), 
    "code": "color", 
    "productTypes": [ 
    { 
     "$ref": "productTypes", 
     "$id": 'car', 
     "$db": "test" 
    } 
    ] 
} 

संदर्भित दस्तावेज़:

{ 
    "_id": 'car' 
} 

क्वेरी:

$query->field('productTypes.$id')->equals('car'); 
+4

यह प्रश्न का समाधान नहीं करता है। आप सब कुछ के लिए एम्बेड * का उपयोग नहीं कर सकते- संदर्भ * एक कारण के लिए है। वास्तविक समस्या जैसा कि मैंने देखा है कि आपको वास्तविक डीबी में अपने आप को यह महसूस करने के लिए देखना है कि संदर्भ $ varname.id के रूप में मैप किए गए हैं। तो आप क्वेरी कर सकते हैं: ...-> findBy (सरणी ('संदर्भ फ़ील्ड.आईडी' => प्रबंधित डॉक-> getId()) फिर भी यह निश्चित रूप से एक अच्छा समाधान नहीं है क्योंकि किसी को आंतरिक तरीके के बारे में परवाह नहीं है या यहां तक ​​कि पता नहीं होना चाहिए संदर्भ * संघ ... –

+5

असल में, मैं इसे वापस ले आंशिक रूप से लेता हूं।DocumentPersister-> DoctrineMM में सिद्धांत \ ODM \ MongoDB \ Persisters में createQueryValue() जादू करना प्रतीत होता है! यह खोज * क्वेरी में 'contextVar.idField' को परिवर्तित करता है ताकि संदर्भ * के अंतर्निहित कार्यान्वयन के बावजूद यह काम करेगा। अर्थात। ऐसा लगता है कि findOneBy ('संदर्भित Doc.id' -> ... some_id ...) इच्छित उपयोग है ... मैं लगातार आश्चर्यचकित हूं कि मोंगो के लिए डॉक्टर ओडीएम बनाने में कितना काम चला गया है। यह बहुत बड़ा और बहुत अच्छा विचार है! –

+1

@JakubP। इन टिप्पणियों को उत्तर के रूप में जोड़ने के बारे में। –

0
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i')) 
4

आप संदर्भ() एक @MongoDB \ ReferenceOnehttps://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html तरह

$productType = $dm->getRepository('Cms\Model\ProductTypes')->findOneByCode('car'); 

$queryBuilder = $dm->getRepository('Cms\Model\Param')->createQueryBuilder() 
        ->field('productTypes')->references($productType); 

$results = $queryBuilder->getQuery()->execute(); 
के लिए क्वेरी बिल्डर की
विधि का उपयोग करना चाहिए


पुनश्च: का उपयोग includesReferenceTo() एक @MongoDB \ ReferenceMany

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