2017-02-09 5 views
0

Ich arbeite an einer E-Commerce-basierten Website mit MongoDb.Kombinieren Sie 2 separate Ergebnisse mongo db

In meiner db Sammlung Ich habe 2 Arten von Dokumenten

  1. Firmendetails Artikel

    { doc_type : 'company', name : 'Acer', type : 'Laptops', helpline : '1800-200-000' }

  2. ItemDetails

    {doc_type : "item", item_id : 1001, price : 2000, discount : 20}

Jetzt in der Produktseite muss ich Daten von beiden Dokumenten erhalten.

so, zuerst laufen i

db.collection.find({doc_type:'item', item_id : 1001 }); 

Produktdaten zu zeigen, und dann

db.collection.find({doc_type:'company', name: "Acer"}); 

Unternehmensdaten zu erhalten.

Ist sie eine Möglichkeit, diese 2 Anrufe ein und erhalten Daten in einzelnen Ergebnismengen zu reduzieren.

wie

{ 
company : { //company data}, 
item : { //item details } 
} 

Antwort

1

die Beispielausgabe zu erreichen, die Sie freigegeben haben, zusammen mit den $match und $group Stufen habe ich eine $project Stufe hinzugefügt.

db.col.aggregate([ 
{ 
    $match: 
    { 
    $or: [ 
    {doc_type:'item', item_id : 1001 }, 
    {doc_type:'company', name: 'Acer'} 
    ] 
    } 
}, 
{ 
    $group: 
    { 
    _id: null, 
    "company_name": {$max: "$name"}, 
    "company_type": {$max: "$type"}, 
    "company_helpline": {$max: "$helpline"}, 
    "item_price": {$max: "$price"}, 
    "item_discount": {$max: "$discount"} 
    } 
}, 
{ 
    $project: 
    { 
    _id: 0, 
    'company' : { 
    'name': '$company_name', 
    'type': '$company_type', 
    'helpline': '$company_helpline', 
    }, 
    'item' : { 
    'price': '$item_price', 
    'discount': '$item_discount' 
    } 
    } 
} 
]).pretty() 

Output:

{ 
     "company" : { 
       "name" : "Acer", 
       "type" : "Laptops", 
       "helpline" : "1800-200-000" 
     }, 
     "item" : { 
       "price" : 2000, 
       "discount" : 20 
     } 
} 
+0

wirkt sich dies auf die Leistung aus, da die Items-Tabelle 3-4 Lakh-Datensätze enthält ... und manchmal mussten Firmendaten mit 50-60k Artikeldatensätzen zusammengeführt werden? –

+0

Nein, dies hat keinen Einfluss auf die Leistung. Da wir die Stufe "$ match" der Pipeline verwenden, werden nur sehr wenige Dokumente auf die nächsten Ebenen übertragen. Falls Sie ein Speicherproblem haben, versuchen Sie '$ allowDiskUse' mit dem Wert true zu verwenden. –

1

können Sie dies mit Aggregation erreichen eine $match und eine $group Stufe verwendet wird. Die Abfrage wäre:

db.it.aggregate([ 
{$match: 
    {$or: [ 
     {doc_type:'item', item_id : 1001 }, 
     {doc_type:'company', name: "Acer"} 
     ] 
    } 
}, 
{$group: 
    {_id: null, 
    "compagny_name": {$max: "$name"}, 
    "compagny_type": {$max: "$type"}, 
    "compagny_helpline": {$max: "$helpline"}, 
    "item_price": {$max: "$price"}, 
    "item_discount": {$max: "$discount"} 
    } 
}]) 

diese Ausgabe:

{ 
    "_id":null, 
    "compagny_name":"Acer", 
    "compagny_type":"Laptops", 
    "compagny_helpline":"1800-200-000", 
    "item_price":2000, 
    "item_discount":20 
} 
+0

ist eine dauerhafte Veränderung in Daten Aggregieren oder alle Zeit der Benutzer anfordert, generiert? –

+0

@ atulquest93 Nein, dies ändert nicht die Daten in Ihrer Sammlung. Es wird jedes Mal generiert, wenn Sie den Quey – felix

+0

Dank laufen! Noch ein kleiner Zweifel, wirkt sich das auf die Leistung aus? Wie jedes Mal, wenn wir eine Kollektion mit anderen verschmelzen .. oder wenn die Kollektion mehr als 3-4 Lac-Reihen enthält? Wie in meinem Fall können sie 1 Lac Artikel von einer bestimmten Firma sein. –