基于MongoDB对象数组中字段的最大值进行更新

时间:2016-12-15 10:10:08

标签: mongodb

这是我的客户收藏

{
    name: xyz,
    .
    .
    .
    timelines: [
        {
            .
            .
            .
            lastModified: Sat Dec 10 2016 00:00:00 GMT+0530 (IST)
        },
        {
            .
            .
            .
            lastModified: Mon Dec 12 2016 00:00:00 GMT+0530 (IST)
        }
        .
        .
        .
    ]
    createdAt: Sun Nov 20 2016 00:00:00 GMT+0530 (IST)
    lastModified: 'Missing'
}

我想使用最新的lastModified时间轴更新主lastModified字段。在这种情况下,2016年12月12日星期一00:00:00 GMT + 0530(IST)

1 个答案:

答案 0 :(得分:0)

您需要一种机制来聚合文档并从时间轴数组中获取最大日期条目,从聚合和更新循环结果列表 集合中的每个文档都带有此值。基本方法如下:

db.customers.aggregate([
    { "$unwind": "$timelines" },
    { 
        "$group": {
            "_id": "$_id",
            "latestDate": { "$max": "$timelines.lastModified" }
        }
    }
]).forEach(function(doc){
    db.customers.updateOne(
        { "_id": doc._id, "lastModified": { "$lt": doc.latestDate } },
        { "$set": { "lastModified": doc.latestDate } }
    )
});

您可以利用批量API更有效地利用您的更新,批量API可以批量更新您的集合,而不是每个文档发送更新请求,从而使更新更快,更高效。以下示例使用 bulkWrite() 方法演示此内容:

var ops = [];

db.customers.aggregate([
    { "$unwind": "$timelines" },
    { 
        "$group": {
            "_id": "$_id",
            "latestDate": { "$max": "$timelines.lastModified" }
        }
    }
]).forEach(function(doc){
    ops.push({
        "updateOne": {
            "filter": { 
                "_id": doc._id, 
                "lastModified": { "$lt": doc.latestDate } 
            },
            "update": { 
                "$set": { "lastModified": doc.latestDate } 
            }
        }
    });

    // Send to server in batches of 500 operations only
    if (ops.length % 500 === 0) {
        db.customers.bulkWrite(ops);
        ops = [];
    }
})

// Clear remaining queue
if (ops.length > 0)
    db.customers.bulkWrite(ops);