我有一个计划的文件集合:
{ _id: ObjectId, userId: ObjectId, marker: string, datetime: Date, etc... }
这是绑定到用户(marker
)的标记(userId
)的集合。装订日期存储在datetime
字段中。
每天用户可以接收任意数量的标记。
[当我从此集合中获取数据时,我需要添加一个名为allowed
且类型为boolean
的额外字段,并且仅当该记录位于日历的N个最近期记录中时,此字段才必须为true
用户的一天。
例如,如果初始集合看起来像这样,并且N == 2:
{_id: ..., userId: "a", marker: "m1", datetime: "2020-01-01.10:00"}
{_id: ..., userId: "a", marker: "m2", datetime: "2020-01-02.10:00"}
{_id: ..., userId: "a", marker: "m3", datetime: "2020-01-02.11:00"}
{_id: ..., userId: "a", marker: "m4", datetime: "2020-01-02.12:00"}
{_id: ..., userId: "a", marker: "m5", datetime: "2020-01-02.13:00"}
{_id: ..., userId: "b", marker: "m1", datetime: "2020-01-01.10:00"}
{_id: ..., userId: "b", marker: "m2", datetime: "2020-01-01.11:00"}
{_id: ..., userId: "b", marker: "m3", datetime: "2020-01-01.13:00"}
{_id: ..., userId: "b", marker: "m4", datetime: "2020-01-02.11:00"}
{_id: ..., userId: "b", marker: "m5", datetime: "2020-01-02.12:00"}
{_id: ..., userId: "b", marker: "m6", datetime: "2020-01-03.10:00"}
然后,最终结果应如下所示:
{_id: ..., userId: "a", marker: "m1", datetime: "2020-01-01.10:00", allowed: true}
{_id: ..., userId: "a", marker: "m2", datetime: "2020-01-02.10:00", allowed: true}
{_id: ..., userId: "a", marker: "m3", datetime: "2020-01-02.11:00", allowed: true}
{_id: ..., userId: "a", marker: "m4", datetime: "2020-01-02.12:00", allowed: false}
{_id: ..., userId: "a", marker: "m5", datetime: "2020-01-02.13:00", allowed: false}
{_id: ..., userId: "b", marker: "m1", datetime: "2020-01-01.10:00", allowed: true}
{_id: ..., userId: "b", marker: "m2", datetime: "2020-01-01.11:00", allowed: true}
{_id: ..., userId: "b", marker: "m3", datetime: "2020-01-01.13:00", allowed: false}
{_id: ..., userId: "b", marker: "m4", datetime: "2020-01-02.11:00", allowed: true}
{_id: ..., userId: "b", marker: "m5", datetime: "2020-01-02.12:00", allowed: true}
{_id: ..., userId: "b", marker: "m6", datetime: "2020-01-03.10:00", allowed: true}
我正在使用MongoDB 4.2。
db.markers.aggregate([{ $addFields: { 'datetime': { $arrayElemAt: [{ $split: ["$datetime", "."] }, 0] } } },
{ $group: { _id: { userId: '$userId', datetime: '$datetime' }, data: { $push: '$$ROOT' } } }, {
$addFields: {
data: {
$map:
{
input: "$data",
as: "each",
in: { $cond: [{ $lte: [{ $indexOfArray: ["$data", '$$each'] }, 1] }, { $mergeObjects: ['$$each', { allowed: true }] }, { $mergeObjects: ['$$each', { allowed: false }] }] }
}
}
}
}, { $unwind: '$data' }, { $replaceRoot: { newRoot: "$data" } }])