Я новичок в MongoDB. Я создал запрос в mongoDB с помощью php. Используя запрос следующим образом
$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);
Вывод запроса следующим образом
Array
(
[0] => Array
(
[EventTS] => 1497033900000
[MainsPower] => 204
)
[1] => Array
(
[EventTS] => 1497034800000
[MainsPower] => 204
)
[2] => Array
(
[EventTS] => 1497035700000
[MainsPower] => 204
)
)
Но я хочу, чтобы мой результат был таким
Array
(
[0] => Array
(
[EventTS] => [1497033900000, 204]
)
[1] => Array
(
[EventTS] => [1497034800000, 204]
)
[2] => Array
(
[EventTS] => [1497035700000, 204]
)
)
Можно ли изменить формат на указанный выше. Если возможно, дайте мне решение.
После сообщения ответ преобразован в 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);
Вы можете использовать комбинацию $literal
оператора (который позволяет вам возвращать значение без синтаксического анализа, таким образом, вы можете создать массив из одного элемента) и $concatArrays
оператора для объединения массивов из разных полей в один массив. Имейте в виду, что $concatArrays
оператор доступен только для версии MongoDB 3.2.X
или новее. Для более ранних версий используйте $setUnion
оператор вместо оператора, $concatArrays
поскольку он выполняет ту же работу.
Следующий сценарий агрегации оболочки mongo показывает, как можно получить желаемый результат, используя указанные выше операторы в $project
конвейере:
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);
Преобразование вышеуказанного в PHP - тривиальное упражнение.
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения