MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tổng hợp Mongo:phân vùng các giá trị thành các nhóm

Có, nó là có thể. Để so sánh nhiều tài liệu, bạn cần đặt chúng trong một mảng bằng cách sử dụng $ nhóm và chuyển null dưới dạng _id . Sau đó, để bắt đầu so sánh các giá trị, bạn cần một chỉ mục giống như trong vòng lặp for để bạn có thể tạo nó bằng cách sử dụng $ range nhà điều hành.

Để xác định phân vùng, bạn cần gấp đôi $ map . Đầu tiên sẽ trả về một mảng 01 các giá trị trong đó 1 nghĩa là ngày này bắt đầu phân vùng mới.

$map thứ hai là hợp nhất ngày với chỉ mục phân vùng. Để nhận chỉ mục phân vùng, bạn có thể $ sum một mảng con ( $ slice ) trong số các số không và số một.

Ví dụ:

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

Trong khoảng thời gian 20 phút bạn có thể chạy tổng hợp dưới đây:

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

cái nào sẽ in:

{
    "_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
        }
    ]
}

Sân chơi MongoDB




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb findOne () không trả về giá trị nodejs

  2. Truy vấn tài liệu nhúng bằng cách khớp ngày trong MongoDB

  3. Không thể kết nối máy chủ mongodb khi sử dụng NodeJS

  4. Nếu Mongo $ lookup là một kết hợp bên ngoài bên trái, thì tại sao nó lại loại trừ các tài liệu không phù hợp?

  5. Quy tắc đa hóa Mongoose (Nodejs) là gì?