2014-07-04 9 views
5

से वापस आने के लिए चयनित फ़ील्ड प्राप्त करने का प्रयास कर रहा है मुझे अपने कुल कार्य में समस्या हो रही है। मैं डेटाबेस से उपयोगकर्ताओं को सबसे आम आदेश प्राप्त करने की कोशिश कर रहा हूं लेकिन मैं केवल नाम और गिनती वापस कर रहा हूं। मैंने $project ऑपरेटर का उपयोग करने का प्रयास किया है, लेकिन मुझे $group कथन में जो कुछ भी है, उसके अलावा मैं इसे कुछ भी वापस नहीं कर सकता।Mongodb कुल

यहाँ मेरे वर्तमान में समेकित फ़ंक्शन है:

OrderModel.aggregate(
     {$unwind: "$products"}, 
     {$match: { customerID: customerID }}, 
     {$group: { _id: "$products.name", count: {$sum:1}}}, 
     {$project: {name: "$_id", _id:0, count:1, active:1}}, 
     {$sort: {"count" : -1}}, 
     {$limit: 25 }) 

रूप {"count":10, "name": foo"} इस प्रकार है, जबकि मैं पूरी वस्तु वापस जाने के लिए चाहते हैं तो यह सिर्फ एक उत्पादन पैदा करता है; एम्बेडेड दस्तावेज़ और सब कुछ। कोई विचार जहां मैं गलत जा रहा हूँ?

संपादित- जोड़ा उदाहरण दस्तावेज़ और उम्मीद उत्पादन

दस्तावेज़:

{ 
    "charge": {}, 
     "captured": true, 
     "refunds": [ 
     ], 
     "balance_transaction": "txn_104Ics4QFdqlbCVHAdV1G2Hb", 
     "failure_message": null, 
     "failure_code": null, 
     "amount_refunded": 0, 
     "customer": "cus_4IZMPAIkEdiiW0", 
     "invoice": null, 
     "dispute": null, 
     "statement_description": null, 
     "receipt_email": null 
    }, 
    "total": 13.2, 
    "userToken": "cus_4IZMPAIkEdiiW0", 
    "customerID": "10152430176375255", 
    "_id": "53ad927ff0cb43215821c649", 
    "__v": 0, 
    "updated": 20140701082928810, 
    "created": 20140627154919216, 
    "messageReceived": false, 
    "ready": true, 
    "active": false, 
    "currency": "GBP", 
    "products": [ 
     { 
      "name": "Foo", 
      "active": true, 
      "types": [ 
       { 
        "variants": [ 
         { 
          "name": "Bar", 
          "isDefault": false, 
          "price": 13.2 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

अपेक्षित परिणाम:

[ 
    { 
     "name": "Foo", 
     "active": true, 
     "types": [ 
      { 
       "variants": [ 
        { 
         "name": "Bar", 
         "isDefault": false 
        } 
       ] 
      }, 
      { 
       "variants": [ 
        { 
         "name": "Something else", 
         "isDefault": false 
        } 
       ] 
      } 
     ], 
     "quantity": 10 
    }, 
    { 
     "name": "Another product", 
     "active": true, 
     "types": [ 
      { 
       "variants": [ 
        { 
         "name": "Bar", 
         "isDefault": false 
        } 
       ] 
      } 
     ], 
     "quantity": 7 
    } 

]

धन्यवाद!

+0

अपने संग्रह से नमूना दस्तावेज़ दिखाएं। लेकिन अगर "ग्राहक आईडी" वास्तव में दस्तावेजों में एक समूह है तो आप जो कर रहे हैं वह काम नहीं करेगा यदि आप मूल दस्तावेज़ वापस चाहते हैं। स्रोत दस्तावेज़ और आपके अपेक्षित परिणाम दिखाएं। –

+0

@NeilLunn मैंने अभी पोस्ट अपडेट किया है। ग्राहक आईडी दस्तावेजों में समूह नहीं है, सिर्फ इस दस्तावेज़ में एक फ़ील्ड है। – donpisci

उत्तर

10

बड़े पैमाने पर यहां बोलते हुए, $project "दाईं ओर" पक्ष में दस्तावेज़ में फ़ील्ड संपत्ति के "पूर्ण पथ" पर निर्भर करता है। 1 जैसे शॉर्टकट्स केवल उस स्थान के लिए हैं जहां वह तत्व वास्तव में दस्तावेज़ का शीर्ष स्तर है।

इसके अलावा, आप जब आप $group क्षेत्रों बनाए रखने में सक्षम होने की जरूरत है, तो यह वह जगह है जहाँ आप विभिन्न समूह ऑपरेटरों ऐसे $first और $addToSet या $push के रूप में जानकारी आप भीतरी सरणी से puling कर रहे हैं रखने के लिए इस्तेमाल करते हैं। और आपको $unwind यहां दो बार भी होना चाहिए क्योंकि आप दस्तावेज़ों में "प्रकार" को जोड़ रहे हैं, और आप इस मामले में केवल $first नहीं चाहते हैं।

OrderModel.aggregate([ 
    { "$unwind": "$products" }, 
    { "$unwind": "$products.types" }, 
    { "$group": { 
     "_id": "$products.name", 
     "active": { "$first": "$products.active" }, 
     "types": { "$addToSet": "$products.types" }, 
     "quantity": { "$sum": 1 } 
    }}, 
    { "$project": { 
     "_id": 0, 
     "name": "$_id", 
     "active": 1, 
     "types": 1, 
     "quantity": 1 
    }} 
],function(err,results) { 

});