MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Монго агрегиране:разделяне на стойности в групи

Да, възможно е. За да сравните няколко документа, трябва да ги поставите в един масив, като използвате $group и предаване на null като _id . След това, за да започнете да сравнявате стойности, имате нужда от индекс точно както в цикъла for, за да можете да го генерирате с помощта на $range оператор.

За да определите дяловете, имате нужда от двойно $map . Първият ще върне масив от 0 и 1 стойности, където 1 означава, че тази дата започва нов дял.

Втора $map е да обедините дати с индекси на дялове. За да получите индекса на дяла, можете да $sum подмасив ($slice ) от нули и единици.

Например:

db.col.save({ date: ISODate("2019-04-12T21:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T21:15:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T21:45:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T23:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T20:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T18:30:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T20:10:00.000Z") })

За интервал от 20 минути, които можете да изпълнявате под агрегирането:

db.col.aggregate([
    { $sort: { date: 1 } },
    { $group: { _id: null, dates: { $push: "$date" } } },
    {
        $addFields: {
            partitions: {
                $map: {
                    input: { $range: [ 0, { $size: "$dates" } ] },
                    as: "index",
                    in: {
                        $let: {
                            vars: {
                                current: { $arrayElemAt: [ "$dates", "$$index" ] },
                                prev: { $arrayElemAt: [ "$dates", { $add: [ "$$index", -1 ] } ] }
                            },
                            in: {
                                $cond: [
                                    { $or: [ { $eq: [ "$$index", 0 ] }, { $lt: [ { $subtract: [ "$$current", "$$prev" ] }, 1200000 ] } ] },
                                    0,
                                    1
                                ]
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            datesWithPartitions: {
                $map: {
                    input: { $range: [ 0, { $size: "$dates" } ] },
                    as: "index",
                    in: {
                        date: { $arrayElemAt: [ "$dates", "$$index" ] },
                        partition: { $sum: { $slice: [ "$partitions", { $add: [ "$$index", 1 ] } ] } }
                    }
                }
            }
        }
    }
])

който ще отпечата:

{
    "_id" : null,
    "datesWithPartitions" : [
        {
            "date" : ISODate("2019-04-12T18:30:00Z"),
            "partition" : 0
        },
        {
            "date" : ISODate("2019-04-12T20:00:00Z"),
            "partition" : 1
        },
        {
            "date" : ISODate("2019-04-12T20:10:00Z"),
            "partition" : 1
        },
        {
            "date" : ISODate("2019-04-12T21:00:00Z"),
            "partition" : 2
        },
        {
            "date" : ISODate("2019-04-12T21:15:00Z"),
            "partition" : 2
        },
        {
            "date" : ISODate("2019-04-12T21:45:00Z"),
            "partition" : 3
        },
        {
            "date" : ISODate("2019-04-12T23:00:00Z"),
            "partition" : 4
        }
    ]
}

Игра на MongoDB




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да регистрирам заявките, изпълнени от Spring Data MongoDB?

  2. Какво представлява грешката на Mongoose Прехвърлянето към ObjectId не бе успешно за стойност XXX на път _id?

  3. MongoDB Cloud Deployment - High TTFB

  4. Удостоверяването на локалната стратегия за паспорт изглежда работи само на localhost със споделен екземпляр на MongoDB

  5. Инсталация на MongoDB