2016-05-26 12 views
13

ich in diesem Szenario bin jetzt: Ich habe eine Sammlung X:Convert ObjectID zu String in Mongo Aggregation

{ 
    _id:ObjectId('56edbb4d5f084a51131dd4c6'), 
    userRef:ObjectId('56edbb4d5f084a51131dd4c6'), 
    serialNumber:'A123123', 
    ... 
} 

Ich brauche alle Dokumente zu aggregieren, so dass sie durch die userRef + serial Gruppierung, so dass ich ist versucht, wie diese zu verwenden concat:

$group: { 
     _id: { 
      '$concat': ['$userRef','-','$serialNumber'] 
     }, 
     ... 

Also im Grunde in meiner Aggregation in MongoDB, ich brauche durch die Verkettung eines ObjectId zu Gruppendokumenten und ein String. Es scheint jedoch, dass nur $ Concat Strings als Parameter akzeptiert:

uncaught exception: aggregate failed: { 

    "errmsg" : "exception: $concat only supports strings, not OID", 
    "code" : 16702, 
    "ok" : 0 
} 

Gibt es eine Möglichkeit, eine ObjectId in einen String innerhalb eines Aggregations Ausdrucks zu konvertieren?

EDIT:

Diese question bezieht, aber ich die Lösung nicht mein Problem passt. (Speziell, weil ich während der Aggregation ObjectId.toString() nicht verwenden kann)

Tatsächlich konnte ich keine ObjectId(). ToString() Operation in Mongos Dokumentation finden, aber ich frage mich, ob es eine knifflige Sache gibt, die kann in diesem Fall gemacht werden.

+0

Vielleicht '_id: [$ userRef, $ serialNumber]' funktioniert? Es wird dir keine Zeichenfolge geben. –

Antwort

6

Ich konnte keine Möglichkeit finden, das zu tun, was ich wollte. Stattdessen habe ich eine MapReduce-Funktion erstellt, die am Ende die Schlüssel so generiert hat, wie ich es wollte (Verketten anderer Schlüssel).

Am Ende sah es so etwas wie diese:

db.collection('myCollection').mapReduce(
    function() { 
     emit(
      this.userRef.str + '-' + this.serialNumber , { 
       count: 1, 
       whateverValue1:this.value1, 
       whateverValue2:this.value2, 
       ... 
      } 
     ) 
    }, 
    function(key, values) { 
     var reduce = {} 
     .... my reduce function.... 
     return reduce 
    }, { 
     query: { 
      ...filters_here.... 
     }, 
     out: 'name_of_output_collection' 
    } 
); 
+1

können Sie mir bitte sagen, was ist der Code, den Sie geschrieben haben ?? –

+2

@SudhanshuGaur sehen, ob dies hilft. Ich habe den Kommentar bearbeitet –

+0

Vielen Dank für Ihre Antwort ich habe über Aggregation und Karte zu reduzieren und dort habe ich festgestellt, dass Karte reduzieren ist viel langsamer als Aggregation thatisy Ich dachte, es wäre besser, wenn Sie dies tun Aggregation. –

-1

Sie $substrhttps://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substr verwenden können, bevor $concat jedes Objekt Zeichenfolge zu werfen.

Dies ist ein Beispiel für Code, der für mich arbeitet.

group_id_i['_id'] = { 
    '$concat' => [ 
     { '$substr' => [ {'$year' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$month' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$dayOfMonth' => '$t'}, 0, -1] } 
    ] 
} 

Wo t Datetime-Feld ist, diese Aggregation gibt Daten wie so.

{ 
    "_id" => "28-9-2016", 
    "i" => 2 
} 
+0

$ substr scheint am Datum zu arbeiten, aber nicht ObjectId – rrrr

0

Ich glaube, Sie können versuchen, es zu lösen, indem sie ein Array mit den beiden Felder enthält:

{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}} 

diese die Daten mit beiden Feldern zu dem Filter entsprechen können. Bitte beachten Sie, dass die Daten im newkey-Array den gleichen Datentyp mit den filterArray-Elementen haben sollten.