2017-07-29 1 views
0

Ich habe zwei Sammlungen, eine ist order_master und die andere ist product_master. Ich brauche nur diejenigen zu holen, die das jeweilige Produkt Namen sagen ‚Tops‘Wie verbinden Sie zwei Tabelle in Mongodb und wählen Sie alle Details aus beiden Tabellen?

Hier ist meine meine Sammlung Bestellen Meister

_id 
o_type 
product_data 
    ->0 
    ->product_id 
    ->shipping_details 

Product_master

_id 
product_name 
product_type 

basierend auf Produktnamen I Wählen Sie die Bestelldetails

für zB:

Select * from order_master om product_master pm innere Verknüpfung auf pm._id = om.product_data.product_id wo pm.product_name = 'top'

ähnlich wie diese

Wie in Mongo db

schreiben

ich habe versucht, wie diese

$collection = $this->mongo_db->db->selectCollection('product_master'); 
$request = $collection->aggregate(
        array(
         '$match' => array(
          '$and' => array(
           array('product_name' => 'top')   
          ) 
         ) 
        ), 
        array(
         '$lookup' => array(
          'from' => "order_master", 
          'localField' => "product_data.p_id", 
          'foreignField' => "_id", 
          'as' => "product_data" 
         ) 
        ) 
       ); 
+0

Nur mein zwei Cent: MongoDB ist keine schicke Version eines RDBMS. Wenn Sie versuchen, Ihre Daten auf SQL-Art zu modellieren und MongoDB damit konform zu machen, erhalten Sie das Schlimmste aus beiden Welten (vielleicht abgesehen von Replikatsätzen). Lesen Sie die Dokumentation zur Datenmodellierung sorgfältig und überdenken Sie Ihr Datenmodell. Wenn Sie beitreten müssen, sind die Chancen sehr hoch, dass Sie sich für Ihren Anwendungsfall überanormalisiert haben. –

Antwort

-1

Ja, Sie können „Join“ „Tabellen“ in mongodb mit Aggregate Pipeline, aber Ihr eigentliches Problem ist das Filtern von Dokumenten auf seinem inneren Array-Wert. Meiner Meinung nach müssen Sie zuerst die Produktdaten auflösen. Hier einige Referenzen auf Abwickel https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

Grundsätzlich Abwickeln dekonstruiert das Array, wenn Auftrag A 5 Artikel in product_data hat, dann Abwickeln wird 5 Kopie der Bestellung A mit nur auf einer von 5 Artikel in ihm erstellen.

Danach wenden Sie die Suche an, filtern sie dann mithilfe von Nachschlagen und führen den letzten Schritt durch, der die ID gruppiert, um eine eindeutige Reihenfolge zu erhalten.

Die Abfrage würde so etwas wie dieser

db.getCollection('order_master').aggregate([ 
    {$unwind: '$product_data'}, 
    {$lookup: { 
     from: 'product_master', 
     localField: 'product_data.product_id', 
     foreignField: '_id', 
     as: 'product_details' 
     } 
    }, 
    {$match: {'product_details.product_name': 'tops'}}, 
    {$group: {_id: '$_id'}} 
]) 
+0

Dies würde unnötigerweise alle Aufträge durchlaufen. –

+0

gegeben, wie er seine Daten modelliert, ich könnte jedoch nicht anders denken. – Adit

+0

Genau mein Punkt. Es gibt keinen gültigen Anwendungsfall, um einen Sammlungsscan zu rechtfertigen. Das Datenmodell selbst wird geschraubt, wenn ein solches Konstrukt benötigt wird, um die Fragen zu beantworten. –

Verwandte Themen