Bạn cần sử dụng đường dẫn tổng hợp để đạt được $slice chuỗi, do những hạn chế trong câu lệnh dự án là một phần của truy vấn tìm.
Truy vấn dưới đây không hợp lệ vì $slice đầu tiên sẽ trả về một mảng, thay vì chỉ mục và việc thực thi $slice có phạm vi bên ngoài không thành công.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Hơn nữa, không có cách nào để làm việc trên một trường dự kiến trong cùng một câu lệnh dự án, nếu có thể, chúng tôi có thể sửa đổi thêm văn bản bằng cách áp dụng một lát $ cho nó.
Cách đi sẽ là:
-
Matchbản ghi có tên là foo. -
Unwindmảng văn bản để lên cấp độ đầu tiên. -
Unwindmột lần nữa để đạt đến cấp độ mà chúng tôi muốn. -
Groupcác bản ghi lại với nhau theo tên. -
Projectbản ghi cuối cùng trong nhóm cũng là phần tử cuối cùng của mảng lồng nhau cuối cùng.
Mã:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
hoặc nếu bạn muốn chiếu một phần tử xuất hiện theo một thứ tự cụ thể, thì bạn có thể sử dụng $skip và $limit hoạt động để đạt được điều này.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Chiếu phần tử thứ hai theo thứ tự trong các mảng lồng nhau.