2017-02-09 17 views
0

私はMongoDbを使って電子商取引ベースのウェブサイトに取り組んでいます。私のデシベルコレクションで2つの別々の結果を結合するmongo db

私は

  1. 会社の詳細項目

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

  2. 商品詳細

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

文書の2種類があります10

今、製品ページには、両方のドキュメントからデータを取得する必要があります。

そうでは、最初のiは、会社のデータを取得するために製品データを表示し、

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

する

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

を実行します。

これらの2つの呼び出しを1つに減らし、単一の結果セットでデータを取得する方法はありますか。

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

答えて

1

あなたは$match$groupのステージと一緒に、共有しているサンプル出力を達成するために、私は$projectのステージが追加されました。

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() 

出力:

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

アイテムテーブルが3-4 lakhレコード時には会社のデータを50-60kのアイテムレコードとマージする必要がありますか? –

+0

いいえ、これはパフォーマンスには影響しません。パイプラインの '$ match'ステージを使用しているので、次のレベルに進む文書はほとんどありません。メモリの問題が発生した場合は、 '$ allowDiskUse'をtrueに設定してみてください。 –

1

のようにあなたは$match$groupのステージを使用して、この使用して集約を実現することができます。 クエリは次のようになります。

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"} 
    } 
}]) 

この出力:

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

は、データまたはすべてのタイムを生成し、ユーザーの要求で永続的な変更を集約していますか? –

+0

@ atulquest93いいえ、コレクション内のデータは変更されません。あなたがqueyを実行するたびに生成されます – felix

+0

ありがとう!もう少し疑いの余地はありますか?毎回、1つのコレクションを他のコレクションとマージしています。コレクションに3〜4個以上のLAC行が含まれているとしますか?私の場合のように、彼らは特定の会社からの1 lacのアイテムになることができます。 –

関連する問題