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à:
-
Match
bản ghi có tên là foo. -
Unwind
mảng văn bản để lên cấp độ đầu tiên. -
Unwind
một lần nữa để đạt đến cấp độ mà chúng tôi muốn. -
Group
các bản ghi lại với nhau theo tên. -
Project
bả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.