Ja. Dat is hoe de javascript Array.prototype.slice() methode werkt, die intern wordt gebruikt door mongodb.
Volgens de ECMAScript®-taalspecificatie ,
In jouw geval is relativeStart is -10 ,k = max((-10+5),0), k = 0; (waar, 5 is de lengte van je array).
Vandaar k of skip is altijd 0 , in deze gevallen.
Ja, de projectie-operator werkt op die manier. Tenzij een inclusion of exclusion expliciet is gespecificeerd in de projectieparameter, wordt het hele document opgehaald met de projectie-operators zoals $slice ,$elemmatch wordt toegepast.
db.items.findOne({},{"_id":1,"List": { "$slice": [-10, 3 ] }})
zou terugkeren:
{ "_id" : ObjectId("542babf265f5de9a0d5c2928"), "List" : [ 1, 2, 3 ] }
De tweede parameter voor de findOne() methode is not only for simple projection doel, velden zijn niet geprojecteerd, alleen als een van de field namen hebben een waarde van 0 of 1 tegen hun. Zo niet, dan wordt het hele document teruggestuurd. Als een veld een projection operator heeft om te worden toegepast, is het applied en projected .
Het projectiemechanisme lijkt gebeuren op de onderstaande manier, wanneer de $slice operator is erbij betrokken.
- Standaard worden alle velden opgenomen voor projectie.
- Standaard alle velden waarvan de waarden zijn afgeleid op basis van de projectie-operator,
$slice, indien waarheidsgetrouw , worden altijd weergegeven, ongeacht de onderstaande.
Stappen die plaatsvinden voor uitsluiting of opname.
- De lijst met velden gespecificeerd in de projectieparameter wordt verzameld in de gespecificeerde volgorde.
- Alleen voor het eerste gevonden veld met de waarde '0' of '1' :Als het veld een waarde '0' heeft - dan wordt het uitgesloten, en alle overige velden zijn gemarkeerd om te worden opgenomen. Als een veld '1' heeft - dan wordt het opgenomen, en alle overige velden zijn gemarkeerd om te worden uitgesloten.
- Voor alle volgende velden worden ze uitgesloten of opgenomen op basis van hun waarden.