Slice имеет две версии. $slice(aggregation)
& amp; $slice(projection)
. Вы используете неправильный.
Функция агрегатного среза не имеет встроенной поддержки. Ниже приведен пример одной такой проекции. Сделайте то же самое для всех других полей проекции.
List stype_0 = Arrays.asList("$stype_0", 1, 1);
Bson project = Aggregates.project(Projections.fields(new Document("stype_0", new Document("$slice", stype_0))));
AggregateIterable iterable = dbCollection.aggregate(Arrays.asList(project));
Я копирую ответ chris-morgan и адаптируя его для лучшего ответа на вопрос, чтобы следовать рекомендации dbaupp downthread и соответствовать последним синтаксическим изменениям:
use std::mem;
use std::ptr;
#[derive(Debug)]
struct Thing {
number: usize,
}
macro_rules! make_array {
($n:expr, $constructor:expr) => {{
let mut items: [_; $n] = mem::uninitialized();
for (i, place) in items.iter_mut().enumerate() {
ptr::write(place, $constructor(i));
}
items
}}
}
const SIZE: usize = 50;
fn main() {
let items = unsafe { make_array!(SIZE, |i| Box::new(Some(Thing { number: i }))) };
println!("{:?}", &items[..]);
}
Обратите внимание на необходимость использования unsafe
здесь: проблема в том, что если функция конструктора panic!
s, это приведет к неопределенному поведению.