array arithmetic mongodb mongoose robo3t

arithmetic - pipeline mongodb



Convertir ObjectID en cadena en mongo AgregaciĆ³n (3)

Estoy en este escenario ahora mismo: tengo una colección X:

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

Necesito agregar todos los documentos, agrupándolos por el userRef + serialNumber, así que estoy tratando de usar concat de esta manera:

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

Básicamente, en mi agregación en MongoDB, necesito agrupar documentos mediante la concatenación de un ObjectId y una cadena. Sin embargo, parece que $ concat solo acepta cadenas como parámetros:

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

¿Hay alguna forma de convertir un ObjectId en una cadena dentro de una expresión de agregación?

EDITAR :

Esta pregunta está relacionada, pero la solución no se ajusta a mi problema. (Especialmente porque no puedo usar ObjectId.toString () durante la agregación)

De hecho, no pude encontrar ninguna operación ObjectId (). ToString () en la documentación de Mongo, pero me pregunto si hay algo complicado que se pueda hacer en este caso.


Creo que puedes intentar resolverlo usando una matriz que contenga ambos campos:

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

esto puede coincidir con los datos con ambos campos para el filtro. Tenga en cuenta que los datos en la nueva matriz de claves deben tener el mismo tipo de datos con los elementos filterArray.


No pude encontrar la manera de hacer lo que quería, así que en su lugar, creé una función MapReduce que, al final, generé las claves de la forma que quería (concatenando otras teclas).

Al final, se veía algo como esto:

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


Puede usar $substr https://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substr para convertir cualquier objeto en cadena antes de $concat .

Esta es una muestra de código que me funciona.

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

Donde t es el campo DateTime, esta agregación devuelve datos como ese.

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