Anda perlu menggunakan pipa agregasi untuk mencapai $slice rantai, karena keterbatasan dalam pernyataan proyek yang menjadi bagian dari kueri pencarian.
Kueri di bawah ini tidak valid karena $slice pertama akan mengembalikan array, bukan indeks, dan eksekusi $slice . yang dilingkupi luar gagal.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Selain itu, tidak ada cara untuk mengerjakan bidang yang diproyeksikan dalam pernyataan proyek yang sama, jika memungkinkan, kita dapat memodifikasi teks lebih lanjut dengan menerapkan $slice padanya.
Caranya adalah:
Matchcatatan dengan nama sebagai foo.Unwindarray teks untuk sampai ke tingkat pertama.Unwindlagi untuk mencapai level yang kita inginkan.Groupcatatan bersama-sama dengan nama.Projectrecord terakhir dalam grup yang juga merupakan elemen terakhir dari array bersarang terakhir.
Kode:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
atau jika Anda ingin memproyeksikan elemen yang muncul dalam urutan tertentu, Anda dapat menggunakan $skip dan $limit operasi untuk mencapai ini.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Yang memproyeksikan elemen kedua secara berurutan dalam array bersarang.