Novidade na versão 3.4.
Definição
$splitDivide uma string em uma array de substrings com base em um delimitador.
$splitremove o delimitador e retorna as substrings resultantes como elementos de uma array. Se o delimitador não for encontrado na string,$splitretornará a string original como o único elemento de uma array.$splittem a seguintesintaxe de expressão do operador :{ $split: [ <string expression>, <delimiter> ] } CampoTipoDescriçãostring expressionstring
A string a ser dividida.
string expressionpode ser qualquer expressão válida desde que resolva para uma string. Para mais informações sobre expressões, consulte Expressões.delimiterstring
O delimitador a ser usado ao dividir a expressão de string.
delimiterpode ser qualquer expressão válida desde que resolva para uma string.
Comportamento
O operador $split retorna uma array. As entradas <string expression> e <delimiter> devem ser ambas strings. Caso contrário, a operação falha com um erro.
Exemplo | Resultados | ||
|---|---|---|---|
| | ||
| | ||
| | ||
| | ||
| | ||
| Erro com mensagem:
| ||
| Erro com mensagem:
|
Exemplo
Uma coleção chamada deliveries contém os seguintes documentos:
db.deliveries.insertMany( [ { _id: 1, city: "Berkeley, CA", qty: 648 }, { _id: 2, city: "Bend, OR", qty: 491 }, { _id: 3, city: "Kensington, CA", qty: 233 }, { _id: 4, city: "Eugene, OR", qty: 842 }, { _id: 5, city: "Reno, NV", qty: 655 }, { _id: 6, city: "Portland, OR", qty: 408 }, { _id: 7, city: "Sacramento, CA", qty: 574 } ] )
O objetivo da operação de aggregation a seguir é encontrar a quantidade total de entregas para cada estado e colocar a lista em ordem decrescente. Possui cinco estágios de pipeline:
O estágio
$projectproduz documentos com dois campos,qty(inteiro) ecity_state(array). O operador$splitcria uma array de strings dividindo o campocity, usando uma vírgula seguida de um espaço (", ") como delimitador.O estágio
$unwindcria um registro separado para cada elemento no campocity_state.O estágio
$matchutiliza uma expressão regular para filtrar os documentos da cidade, deixando somente aqueles que contêm um estado.O estágio
$groupagrupa todos os estados e resume o campoqty.O estágio
$sortclassifica os resultados portotal_qtyem ordem decrescente.
db.deliveries.aggregate( [ { $project: { city_state: { $split: ["$city", ", "] }, qty: 1 } }, { $unwind: "$city_state" }, { $match: { city_state: /[A-Z]{2}/ } }, { $group: { _id: { state: "$city_state" }, total_qty: { $sum: "$qty" } } }, { $sort: { total_qty: -1 } } ] )
A operação retorna os seguintes resultados:
[ { _id: { state: "OR" }, total_qty: 1741 }, { _id: { state: "CA" }, total_qty: 1455 }, { _id: { state: "NV" }, total_qty: 655 } ]