这是我的客户收藏
{
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)
答案 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);