sql >> データベース >  >> NoSQL >> MongoDB

Mongoアグリゲーション:値をグループに分割する

    はい、可能です。複数のドキュメントを比較するには、を使用してそれらを1つの配列に配置する必要があります。 $ group nullを渡します _idとして 。次に、値の比較を開始するには、forループの場合と同じようにインデックスが必要です。これにより、 $ range オペレーター。

    パーティションを決定するには、 $map を2つ使用する必要があります。 。最初のものは0の配列を返します および1 1の値 この日付が新しいパーティションを開始することを意味します。

    2番目の$map 日付をパーティションインデックスとマージすることです。パーティションインデックスを取得するには、 $sum を使用できます。 サブアレイ( $ slice )0と1の。

    例:

    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 ] } ] } }
                        }
                    }
                }
            }
        }
    ])
    

    どのwlll印刷:

    {
        "_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. モンゴと地理データで常に100に制限されている検索

    2. HerokuのRails、Mongoid、Unicornの構成

    3. Mongodbは重複エントリを回避します

    4. $Composerがmongodb拡張機能を見つけることができません。Mongodb拡張機能が必要です