2016-06-13 6 views
1

Ich habe eine Sammlung wie folgt aus:mongoDB Abfrage Aggregat mit abzufragen, um die jüngste Datum eines Artikels

[ 
    { product_name: "Orange",vendor_name: "test1", category: "Fruit", business_date: "2015-06-12T00:00:00.000Z"}, 
    { product_name: "Orange",vendor_name: "test1", category: "Fruit", business_date: "2015-02-24T00:00:00.000Z"}, 
    { product_name: "Apple",vendor_name: "test2", category: "Fruit", business_date: "2015-07-11T00:00:00.000Z"}, 
    { product_name: "Apple",vendor_name: "test2", category: "Fruit", business_date: "2015-06-19T00:00:00.000Z"} 
] 

Ich möchte die Sammlung abfragen jedes Einzelteils jüngste „business_date“ zu finden, und in diesem Beispiel Es sollte record #2 und record #4 sein.

Wie würde ich weitergehen und eine aggregate Anfrage dafür schreiben?

Ich habe dies versucht:

var pipeline = [ 
    { 
     $sort: { 
      business_date: -1 
     } 
    }, 
    { 
     $group : { 
      _id : { vendor_name: "$vendor_name", product_code: "$product_code" }, 
      business_date: {$first: "$business_date"} 
     } 
    }, 
    { 
     $match: { 
      vendor_name: {$in: ["test1", "test2"]}, 
      category: 'Fruit' 
     } 
    } 
] 
db.sales.aggregate(pipeline); 

Aber ich bekomme nichts zurück. Ich bin nicht wirklich erfahren mit MongoDB, würde jemand mich wissen lassen, was sollte die richtige (und die meisten Operation effizient) Weg, um diese Abfrage zu schreiben?

+2

Sie sind fast da das letzte Spiel Ergebnisse all herausgefiltert, weil nach der $ Gruppe: die ID 'worden _id: {vendor_name:‚test1‘}'. Achten Sie darauf, dass die Aggrierungs-Pipeline nacheinander von Anfang bis Ende läuft und die Reihenfolge zählt. – somallg

+0

Aggregation Pipeline docs https://docs.mongodb.com/manual/core/aggregation-pipeline/#aggregation-pipeline – Leo

Antwort

1

Das Wichtigste zuerst :-)

  1. Verwendung $match als eine erste Pipeline in der Abfrageverarbeitung Geschwindigkeit (weniger Daten zu verarbeiten)

  2. in $group Sie $min verwenden können, erhöhen - keine Sortierung erforderlich Geschwindigkeit :-)

So wie diese Abfrage aussehen wird:

db.wab.aggregate([{ 
      $match : { 
       vendor_name : { 
        $in : ["test1", "test2"] 
       }, 
       category : 'Fruit' 
      } 
     }, { 
      $group : { 
       _id : { 
        vendor_name : "$vendor_name", 
        product_name : "$product_name" 
       }, 
       business_date : { 
        $min : "$business_date" 
       } 
      } 
     } 
    ]) 
+0

Das ist großartig! Danke. nur eine andere Frage, ich möchte auch das "Preis" -Feld, das mindestens business_date ist, wie würde ich diese Abfrage in der $ Gruppe schreiben? – WABBIT0111

+0

Ich erstelle eine andere Frage für ^^ oben. http://stackoverflow.com/questions/37795662/mongodb-query-using-aggregate-to-query-the-most-recent-date-of-an-item-and-retur – WABBIT0111

Verwandte Themen