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:
Match
catatan dengan nama sebagai foo.Unwind
array teks untuk sampai ke tingkat pertama.Unwind
lagi untuk mencapai level yang kita inginkan.Group
catatan bersama-sama dengan nama.Project
record 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.