Soy nuevo en MongoDB. He creado una consulta en mongoDB usando php. Usando la consulta de la siguiente manera
$date_start = new MongoDate(strtotime("2016-06-08T18:30:00.000Z"));
$default_date = new MongoDate(strtotime("1970-01-01T00:00:00.000Z"));
$pipeline = array(
array('$project' => array(
'MainsPower' => 1,
'EventTS' => 1
)
),
array('$unwind' => array(
'path' => '$MainsPower',
'includeArrayIndex' => "arrayIndex",
'preserveNullAndEmptyArrays' => true
)
),
array('$match' => array(
'$and' => array(
//array('EventTS' => array('$gt' => $date_start)),
//array('PanelID' => 'A00911'),
array("MainsPower" => array('$ne' => null))
)
)
),
array(
'$project' => array(
'MainsPower' => 1,
'_id' => 0,
'EventTS' => array(
'$add' => array(
array('$subtract' => array('$EventTS', $default_date)),
array('$multiply' => array( 60000, '$arrayIndex' ))
)
)
)
),
);
$result = $collection->aggregate($pipeline);
Resultado de la consulta de la siguiente manera
Array
(
[0] => Array
(
[EventTS] => 1497033900000
[MainsPower] => 204
)
[1] => Array
(
[EventTS] => 1497034800000
[MainsPower] => 204
)
[2] => Array
(
[EventTS] => 1497035700000
[MainsPower] => 204
)
)
Pero quiero mi salida así
Array
(
[0] => Array
(
[EventTS] => [1497033900000, 204]
)
[1] => Array
(
[EventTS] => [1497034800000, 204]
)
[2] => Array
(
[EventTS] => [1497035700000, 204]
)
)
¿Es posible cambiar al formato anterior? Si es posible, por favor dame una solución.
Después de publicar la respuesta convertida a PHP
$pipeline = array(
array(
'$unwind' => array(
'path' => '$MainsPower',
'includeArrayIndex' => "arrayIndex",
'preserveNullAndEmptyArrays' => true
)
),
array('$match' =>
array("MainsPower" => array('$ne' => null))
),
array(
'$project' => array(
'MainsPower' => 1,
'EventTS' => array(
'$add' => array(
array('$subtract' => array('$EventTS', $var)),
array('$multiply' => array( 60000, '$arrayIndex' ))
)
)
)
),
array(
'$project' => array(
'MainsPower' => array('$literal' => '$MainsPower'),
'EventTS' => array('$literal' => '$EventTS')
)
),
array(
'_id' => 0,
'EventTS' => array(
'$concatArrays' => ['$EventTS', '$MainsPower']
)
)
);
$result = $collection->aggregate($pipeline);
Puede usar una combinación del $literal
operador (que le permite devolver un valor sin analizar, por lo que puede crear una matriz de un solo elemento) y el $concatArrays
operador para concatenar matrices de diferentes campos en una matriz. Tenga en cuenta que el $concatArrays
operador solo está disponible para la versión MongoDB 3.2.X
o posterior. Para versiones anteriores, use el $setUnion
operador en lugar del, $concatArrays
ya que hace el mismo trabajo.
El siguiente script de agregación de mongo shell muestra cómo puede obtener el resultado deseado utilizando los operadores anteriores en la $project
canalización:
var date_start = new Date("2016-06-08T18:30:00.000Z"),
default_date = new Date("1970-01-01T00:00:00.000Z"),
pipeline = [
{
"$unwind": {
"path": "$MainsPower",
"includeArrayIndex": "arrayIndex",
"preserveNullAndEmptyArrays": true
}
},
{
"$match": { "MainsPower": { "$ne": null } }
},
{
"$project": {
"MainsPower": 1,
"EventTS": {
"$add": [
{ "$subtract": ["$EventTS", default_date] },
{ "$multiply": [60000, "$arrayIndex"] }
]
}
}
},
{
"$project": {
"MainsPower": { "$literal": ["$MainsPower"] },
"EventTS": { "$literal": ["$EventTS"] }
}
},
{
"$project": {
"_id": 0,
"EventTS": {
"$concatArrays": ["$EventTS", "$MainsPower"]
}
}
}
];
db.collection.aggregate(pipeline);
Convertir lo anterior a PHP es un ejercicio trivial.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras