2010-09-30 12 views
8

मैं मोंगो PHP एक्सटेंशन का उपयोग कर रहा हूं।mongodb php - कैसे करें "INNER JOIN" -like क्वेरी

users 
{ 
    "_id": "4ca30369fd0e910ecc000006", 
    "login": "user11", 
    "pass": "example_pass", 
    "date": "2010-09-29" 
}, 
{ 
    "_id": "4ca30373fd0e910ecc000007", 
    "login": "user22", 
    "pass": "example_pass", 
    "date": "2010-09-29" 
} 

news 
{ 
    "_id": "4ca305c2fd0e910ecc000003", 
    "name": "news 333", 
    "content": "news content 3333", 
    "user_id": "4ca30373fd0e910ecc000007", 
    "date": "2010-09-29" 
}, 
{ 
    "_id": "4ca305c2fd0e910ecc00000b", 
    "name": "news 222", 
    "content": "news content 2222", 
    "user_id": "4ca30373fd0e910ecc000007", 
    "date": "2010-09-29" 
}, 
{ 
    "_id": "4ca305b5fd0e910ecc00000a", 
    "name": "news 111", 
    "content": "news content", 
    "user_id": "4ca30369fd0e910ecc000006", 
    "date": "2010-09-29" 
} 

कैसे PHP से एक प्रश्न इस तरह समान, चलाने के लिए:

मेरे डेटा की तरह दिखता है?

SELECT n.*, u.* 
FROM news AS n 
INNER JOIN users AS u ON n.user_id = u.id 

उत्तर

4

आप उपयोगकर्ताओं के दस्तावेज़ों में "समाचार" को एम्बेड करने से बेहतर हो सकते हैं।

+0

सर्वोत्तम उत्तर, nosql लेटिन के बारे में सब कुछ है नई चीजों के लिए जी चीजें जीवन में आती हैं –

18

मोंगोडीबी शामिल होने का समर्थन नहीं करता है। यदि आप उपयोगकर्ताओं को समाचार में मैप करना चाहते हैं, तो आप निम्नलिखित

कर सकते हैं 1) एप्लिकेशन-लेयर पर ऐसा करें। उपयोगकर्ताओं की सूची प्राप्त करें, और समाचार की सूची प्राप्त करें और उन्हें अपने आवेदन में मानचित्र बनाएं। यदि आपको अक्सर इसकी आवश्यकता होती है तो यह विधि बहुत महंगा है।

2) यदि आपको अक्सर पिछले चरण की आवश्यकता है, तो आपको अपनी स्कीमा को फिर से डिजाइन करना चाहिए ताकि समाचार लेख उपयोगकर्ता दस्तावेज़ों के साथ एम्बेडेड दस्तावेज़ों के रूप में संग्रहीत किए जाएं।

{ 
     "_id": "4ca30373fd0e910ecc000007", 
     "login": "user22", 
     "pass": "example_pass", 
     "date": "2010-09-29" 
     "news" : [{ 
        "name": "news 222", 
        "content": "news content 2222", 
        "date": "2010-09-29" 
       }, 
       { 
        "name": "news 222", 
        "content": "news content 2222", 
        "date": "2010-09-29" 
       }] 
    } 

एक बार जब आप इस प्रारूप में अपना डेटा प्राप्त कर लेते हैं, तो क्वेरी जिसे आप चलाने की कोशिश कर रहे हैं वह निहित है। हालांकि, ध्यान देने योग्य बात यह है कि ऐसी स्कीमा पर विश्लेषण क्वेरी मुश्किल हो जाती है। सबसे हाल ही में जोड़े गए समाचार लेख और ऐसे प्रश्न प्राप्त करने के लिए आपको MapReduce का उपयोग करने की आवश्यकता होगी।

अंत में स्कीमा-डिज़ाइन और आपका एप्लिकेशन कितना denormalization संभाल सकता है इस पर निर्भर करता है कि आप किस प्रकार के प्रश्नों को अपने एप्लिकेशन को चलाने की उम्मीद करते हैं।

आप ये लिंक उपयोगी पा सकते हैं। http://www.mongodb.org/display/DOCS/Schema+Design http://www.blip.tv/file/3704083

मुझे उम्मीद है कि यह सहायक था।

+0

यदि आप अपने उपयोगकर्ताओं के साथ एम्बेडेड पूरे समाचार लेख संग्रहीत कर रहे हैं, तो क्या 4 एमबी ऑब्जेक्ट स्टोरेज सीमित है? – jocull

+0

आप वास्तविक दस्तावेज़ के बजाय dbrefs का उपयोग कर सकते हैं http://docs.mongodb.org/manual/applications/database-references/ – Optimus

14

जुड़ने के बारे में भूल जाओ।

अपने समाचार पर एक खोज करें। परिणामों को पेजिंग के लिए स्किप नंबर और सीमा लागू करें।

$newscollection->find().skip(20).limit(10); 

फिर संग्रह के माध्यम से लूप करें और इस उदाहरण में user_id को पकड़ें, तो आप 10 आइटम तक सीमित रहेंगे। अब उपयोगकर्ता_आईडी वस्तुओं के लिए उपयोगकर्ताओं पर एक प्रश्न पूछें।

// replace 1,2,3,4 with array of userids you found in the news collection. 
$usercollection.find({ _id : { $in : [1,2,3,4] } }); 

फिर जब आप खबर यह user_id के आधार पर उपयोगकर्ता संग्रह से उपयोगकर्ता जानकारी प्रदर्शित कर सकते हैं प्रिंट आउट।

आपने डेटाबेस के लिए 2 प्रश्न किए हैं। जुड़ने और मैदान के नामों को समझने के साथ चारों ओर गड़बड़ नहीं है। सरल !!!

0

आप इसे mongoDB में नहीं कर सकते हैं। और संस्करण 3 इवल() से बहिष्कृत किया गया है, इसलिए आपको संग्रहित प्रक्रियाओं का उपयोग नहीं करना चाहिए।

एकमात्र तरीका जिसे मैं एक सर्वर साइड क्वेरी प्राप्त करने के बारे में जानता हूं, जिसमें कई संग्रह शामिल हैं, अभी यह नोड.जेएस या इसी तरह का उपयोग करना है। लेकिन यदि आप इस विधि को आजमाने की कोशिश कर रहे हैं, तो मैं सुरक्षा कारणों से आपकी मशीन तक पहुंचने के लिए अनुमति देने वाले आईपी पते को सीमित करने की दृढ़ता से अनुशंसा करता हूं।

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

4

आप MongoDB (3.2) के नए संस्करण का उपयोग कर रहे हैं, तो आप $lookup ऑपरेटर जो एसक्यूएल में शामिल होने के एक छोड़ दिया बाहरी करने के लिए likened किया जा सकता के साथ कुछ ऐसा ही मिलेगा।

इस ऑपरेटर का उपयोग करने में कमी यह है कि बड़े परिणाम सेट पर चलने पर यह अत्यधिक अक्षम होता है और यह केवल उस मैच के लिए समानता का समर्थन करता है जहां समानता प्रत्येक संग्रह से एक कुंजी के बीच होती है। दूसरी सीमा यह है कि बाएं संग्रह के समान डेटाबेस में सही संग्रह एक अनधिकृत संग्रह होना चाहिए।

db.news.aggregate([ 
    { 
     "$lookup": { 
      "from": "users", 
      "localField": "user_id", 
      "foreignField": "_id", 
      "as": "user_docs" 
     } 
    } 
]) 

बराबर:

news संग्रह पर निम्नलिखित एकत्रीकरण आपरेशन users संग्रह से news संग्रह से खेतों user_id का उपयोग कर users संग्रह से दस्तावेजों और _id क्षेत्र के साथ news से दस्तावेजों में शामिल PHP उदाहरण कार्यान्वयन:

<?php 
$m = new MongoClient("localhost"); 
$c = $m->selectDB("test")->selectCollection("news"); 
$ops = array(
    array(
     "$lookup" => array(
      "from" => "users", 
      "localField" => "user_id", 
      "foreignField" => "_id", 
      "as" => "user_docs" 
     ) 
    ) 
); 
$results = $c->aggregate($ops); 
var_dump($results); 
?> 
संबंधित मुद्दे