MongoDB разбить массив на массив из N элементов по четному элементу - PullRequest
0 голосов
/ 23 декабря 2018

Привет, у меня есть вопрос по агрегатам MongoDB.

Я хочу разделить мой список дат

"checked" : [
    ISODate("2018-11-01T07:00:00.000+0000"), 
    ISODate("2018-11-01T15:00:00.000+0000"), 
    ISODate("2018-11-02T07:00:00.000+0000"), 
    ISODate("2018-11-02T15:00:00.000+0000"), 
    ISODate("2018-11-03T07:00:00.000+0000"), 
    ISODate("2018-11-03T15:00:00.000+0000"), 
    ISODate("2018-11-04T07:00:00.000+0000"), 
    ISODate("2018-11-04T15:00:00.000+0000"), 
    ISODate("2018-12-01T07:00:00.000+0000"), 
    ISODate("2018-12-01T15:00:00.000+0000"), 
    ISODate("2018-12-02T07:00:00.000+0000"), 
    ISODate("2018-12-02T15:00:00.000+0000"), 
    ISODate("2018-12-03T07:00:00.000+0000"), 
    ISODate("2018-12-03T15:00:00.000+0000"), 
    ISODate("2018-12-04T07:00:00.000+0000"), 
    ISODate("2018-12-04T15:00:00.000+0000")
]

На 2-элементные маленькие массивы, подобные этому:

"checked" : [
    [
        ISODate("2018-11-01T07:00:00.000+0000"), 
        ISODate("2018-11-01T15:00:00.000+0000")
    ],
    [
        ISODate("2018-11-02T07:00:00.000+0000"), 
        ISODate("2018-11-02T15:00:00.000+0000") 
    ],
    [
        ISODate("2018-11-03T07:00:00.000+0000"), 
        ISODate("2018-11-03T15:00:00.000+0000") 
    ],
    ...
]

Можно ли в агрегации добиться этого?

Я видел, что есть $ split, но он работает со строками.Также есть сокращение $, но оно сокращается.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете использовать $ range для генерации массива индексов с параметром step, установленным на 2.Тогда вам просто нужно $ slice , чтобы получить массив из двухэлементных массивов, попробуйте:

db.col.aggregate([
    {
        $addFields: {
            checked: {
                $map: {
                    input: { $range: [ 0, { $size: "$checked" }, 2 ] },
                    as: "index",
                    in: { $slice: [ "$checked", "$$index", 2 ] }
                }
            }
        }
    }
])
...