2014-07-04 15 views
5

zurückgegeben zu bekommen Ich habe Probleme mit meiner Aggregatfunktion. Ich versuche, die häufigsten Bestellungen der Benutzer aus der Datenbank zu bekommen, aber ich gebe nur den Namen und die Anzahl zurück. Ich habe versucht, den Operator $project zu verwenden, aber ich kann nicht scheinen, dass es irgendetwas zurückgibt, was in der $group Aussage ist.Mongodb Versucht, ausgewählte Felder von Aggregat

Hier ist meine aktuelle Aggregatfunktion:

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

Dies ist nur eine Ausgabe erzeugt, wie {"count":10, "name": foo"} folgt, während ich das ganze Objekt zurückkehren wollen; eingebettete Dokumente und alle. Irgendwelche Ideen, wo ich falsch liege?

Bearbeiten- Added Beispieldokument und erwartete Ausgabe

Dokument:

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

Erwartetes Ergebnis:

[ 
    { 
     "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 
    } 

]

Dank!

+0

Zeigen Sie ein Beispieldokument aus Ihrer Sammlung an. Aber wenn "customerID" tatsächlich eine Gruppierung zwischen Dokumenten ist, dann wird das, was Sie tun, nicht funktionieren, wenn Sie die Originaldokumente zurück haben wollen. Zeigen Sie die Quelldokumente und Ihre erwarteten Ergebnisse an. –

+0

@NeilLunn Ich habe den Beitrag jetzt aktualisiert. CustomerId ist keine Gruppierung zwischen Dokumenten, nur ein Feld in diesem Dokument. – donpisci

Antwort

10

Weitgehend gesagt, $project stützt sich hier auf den "absoluten Pfad" zur Feldeigenschaft im Dokument auf der "rechten" Seite. Verknüpfungen wie 1 sind nur für wo das Element tatsächlich die oberste Ebene des Dokuments ist.

Auch müssen Sie in der Lage sein, Felder zu behalten, wenn Sie $group, so ist dies in dem Sie verschiedene Gruppierung Operatoren wie $first und $addToSet oder $push die Informationen halten Sie von der inneren Array puling. Und Sie müssen $unwind zweimal auch hier, da Sie "Arten" über Dokumente kombinieren, und Sie wollen nicht nur die $first in diesem Fall.

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

}); 
Verwandte Themen