MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

É possível obter uma fatia de uma fatia em Mongo?


Você precisa usar o pipeline de agregação para obter um $slice chain, devido às limitações na declaração do projeto fazer parte da consulta de localização.

A consulta abaixo é inválida porque o primeiro $slice retornaria uma matriz, em vez de um índice, e a execução do $slice com escopo externo falha.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})

Além disso, não há como trabalhar em um campo projetado na mesma declaração de projeto, se possível, poderíamos ter modificado o texto ainda mais aplicando um $slice nele.

O caminho seria:
  • Match o registro com o nome como foo.
  • Unwind a matriz de texto para chegar ao primeiro nível.
  • Unwind novamente para chegar ao nível que queremos.
  • Group os registros juntos por nome.
  • Project o último registro no grupo que também é o último elemento do último array aninhado.

O código:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])

ou se você quiser projetar um elemento aparecendo em uma ordem específica, então você pode usar o $skip e $limit operações para conseguir isso.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])

Que projeta o segundo elemento em ordem nas matrizes aninhadas.