En général, oui. Si vous avez un champ monotone, idéalement un champ indexé, vous pouvez simplement marcher le long de celui-ci. Par exemple, si vous utilisez des champs de type ObjectId
comme clé primaire ou si vous avez une CreatedDate
ou quelque chose, vous pouvez simplement utiliser un $lt
requête, prenez un nombre fixe d'éléments, puis interrogez à nouveau en utilisant $lt
du plus petit _id
ou CreatedDate
que vous avez rencontré dans le lot précédent.
Faites attention au comportement monotone strict par rapport au comportement monotone non strict :vous devrez peut-être utiliser $lte
si les clés ne sont pas strictes, évitez de faire les choses deux fois sur les dupes. Depuis le _id
le champ est unique, ObjectIds
sont toujours strictement monotones.
Si vous n'avez pas une telle clé, les choses sont un peu plus délicates. Vous pouvez toujours itérer "le long de l'index" (quel que soit l'index, qu'il s'agisse d'un nom, d'un hachage, d'un UUID, d'un Guid, etc.). Cela fonctionne aussi bien, mais il est difficile de faire un instantané, car vous ne savez jamais si le résultat que vous venez de trouver a été inséré avant que vous ne commenciez à parcourir ou non. De plus, lorsque des documents sont insérés au début du parcours, ceux-ci seront manqués.