2016-03-31 7 views
1

Ich habe Gesicht eine Verwendung mit Mongodb.Projekt mit Match in Aggregat funktioniert nicht nach der Verwendung substr in mongodb

unten ist mein Beispiel Datensatz. Also alles recored zu bekommen mit einzigartigen Datum

, ich habe unter Abfrage mit Aggregat gemacht

.aggregate(
      [ 
       { 
        "$match":{ 
          "yearSubstring":"2016", 
          "monthSubstring":"03", 
          "us_dealer_u_id":"1459169911J4gPxpYQ7A" 
          } 
       }, 
       { 
        "$project": 
          { 
          "yearSubstring":{"$substr":["$us_date",0,4]}, 
          "monthSubstring":{"$substr":["$us_date",4,2]}, 
          "daySubstring":{"$substr":["$us_date",6,2]} 
          } 
       }, 
       { 
        "$group": 
          { 
           "_id":{"monthSubstring":"$monthSubstring", 
             "yearSubstring":"$yearSubstring", 
             "daySubstring":"$daySubstring" 
            }, 
           "daySubstring":{"$last":"$daySubstring"} 
          } 
       }, 
       {"$sort":{"us_date":1}} 
      ] 
     ) 

Ich versuche

{ 
    "_id" : ObjectId("56fa21da0be9b4e3328b4567"), 
    "us_u_id" : "1459169911J4gPxpYQ7A", 
    "us_dealer_u_id" : "1459169911J4gPxpYQ7A", 
    "us_corporate_dealer_u_id" : "1459169173rgSdxVeMLa", 
    "us_oem_u_id" : "1459169848CK5yOpXito", 
    "us_part_number" : "E200026", 
    "us_sup_part_number" : "", 
    "us_alter_part_number" : "", 
    "us_qty" : 0, 
    "us_sale_qty" : 2, 
    "us_date" : "20160326", 
    "us_source_name" : "BOMAG", 
    "us_source_address" : "", 
    "us_source_city" : "", 
    "us_source_state" : "", 
    "us_zip_code" : "", 
    "us_alternet_source_code" : "", 
    "updated_at" : ISODate("2016-03-29T06:34:02.728Z"), 
    "created_at" : ISODate("2016-03-29T06:34:02.728Z") 
} 

Ich versuche haben müssen beide Wege Jahr und Monden (als String und als int)

aber ich habe leere Ergebnis erhalten.

Wenn ich Monat und Jahr aus der Bedingung entfernen, dann kam die Aufzeichnung.

meistens habe ich alle diff ausprobieren. diff. Lösung aber Ergebnis ist gleich.

Vielen Dank im Voraus.

+0

Das '$ match' ist an der falschen Stelle. Sie benötigen es "nach" dem $ -Projekt, das die Felder verändert. Außerdem haben Sie einen späteren Aufruf von '$ sort' in einem '' us_date''-Feld, das weder in dem' $ project' noch in der nachfolgenden '$ group' steht. Sie müssen dieses Feld in beide einschließen, sonst ist es einfach nicht da. –

+0

Es ist auch keine schlaue Art, an einem Datum zu suchen. Verwenden Sie einen "Bereich", anstatt das Datum aufzubrechen. Auf diese Weise ist es viel effizienter. –

+0

@BlakesSeven Ich sage dir zuerst, ich habe versucht, alle möglichen Wege, um das Problem zu lösen, aber immer noch nicht –

Antwort

3

Sie haben eine falsche Abfrage geschrieben.

Sie haben noch yearSubstring und monthSubstring Felder auf dieser Bühne.

{ 
     "$match":{ 
       "yearSubstring":"2016", 
       "monthSubstring":"03", 
       "us_dealer_u_id":"1459169911J4gPxpYQ7A" 
       } 
    }, 

Sie sollten wie folgt schreiben:

.aggregate(
      [ 
       { 
        "$match":{ 
          "us_dealer_u_id":"1459169911J4gPxpYQ7A" 
          } 
       }, 
       { 
        "$project": 
          { 
          "yearSubstring":{"$substr":["$us_date",0,4]}, 
          "monthSubstring":{"$substr":["$us_date",4,2]}, 
          "daySubstring":{"$substr":["$us_date",6,2]} 
          } 
       }, 
       { 
        "$match":{ 
          "yearSubstring":"2016", 
          "monthSubstring":"03" 
       } 
     }, 
       { 
        "$group": 
          { 
           "_id":{"monthSubstring":"$monthSubstring", 
             "yearSubstring":"$yearSubstring", 
             "daySubstring":"$daySubstring" 
            }, 
           "daySubstring":{"$last":"$daySubstring"} 
          } 
       }, 
       {"$sort":{"us_date":1}} 
      ] 
     ) 

Wenn Sie andere Felder erhalten möchten, sollten Sie sie in Projektionsstufe umfassen.

+0

@Vladislav_Kievski Vielen Dank für die Unterstützung –

Verwandte Themen