да Ето как javascript Array.prototype.slice() методът работи, който се използва вътрешно от mongodb.
Съгласно Езикова спецификация ECMAScript® ,
Във вашия случай relativeStart is -10 ,k = max((-10+5),0), k = 0; (където, 5 е дължината на вашия масив).
Следователно k или skip винаги ще бъде 0 , в тези случаи.
Да, проекционният оператор работи по този начин. Освен ако не е inclusion или exclusion е изрично посочен в параметъра за проекция, целият документ се извлича с операторите за проекция като $slice ,$elemmatch се прилага.
db.items.findOne({},{"_id":1,"List": { "$slice": [-10, 3 ] }})
ще върне:
{ "_id" : ObjectId("542babf265f5de9a0d5c2928"), "List" : [ 1, 2, 3 ] }
Вторият параметър към findOne() методът е not only for simple projection предназначение, полетата са сната проектирано, само ако някое от field имената имат стойност 0 или 1 Срещу тях. Ако не се връща целият документ. Ако някое поле има projection operator за да бъде приложен, ще бъде applied и projected .
Прожекционният механизъм изглежда да се случи по следния начин, когато $slice участва оператор.
- По подразбиране всички полета ще бъдат включени за проекция.
- По подразбиране всички полета, чиито стойности се извличат въз основа на оператора за проекция,
$slice, ако е истина , винаги се показват, независимо от по-долу.
Стъпки, предприети за изключване или включване.
- Списъкът с полета, посочени в параметъра на проекцията, се натрупват в посочения им ред.
- Само за първото срещано поле със стойност „0“ или „1“ :Ако полето има стойност '0' - то е изключено и всички останали полета са маркирани за включване. Ако поле има '1' - то е включено и всички останали полета са маркирани за изключване.
- За всички следващи полета те се изключват или включват въз основа на техните стойности.