我在优化Meteor集合的更新性能方面存在问题。
我从一个集合(CollectionA)中获取文档,修改它,挑选一些内容,然后在另一个集合(CollectionB)中更新它的近似副本。如果已经将新文档添加到CollectionA
,我也会进行备份一切都在几毫秒内完成,但更新可能需要10-30秒,具体取决于要更新的文档的大小。这些文件通常约为30kb ......
我尝试过没有Meteor.defer,writeConcern:0,以及本地和云副本集群集。也尝试使用insert而不是更新。没有什么能产生显着的差异。
cronTask(){
CollectionA.find({isPublished : true, "approval.status" : { $gte : 1 } }).forEach((doc)=>{
let newDoc = {
parentId : doc._id,
slug : doc.slug, // these never change, only the content array changes...
title : doc.title,
description: doc.description,
tags : doc.tags,
category : doc.category,
createdAt : new Date(),
content: [...,...,...] // the content of the new document is cherrypicked from the parents before saving
}
while(doc.content.length) {
// cherry-picking and pushing to newDoc.content
// super quick, a couple of MS
}
Meteor.defer(()=>{
CollectionB.update({parentId : doc._id}, {$set : newDoc}, {upsert : true}, (err,res)=>{
if (!err) {
console.log(`Saved child for ${doc.title}`);
} else {
console.log(`Error saving child for ${doc.title}: ${err}`);
}
});
});
});
}
答案 0 :(得分:1)
原来这个问题实际上不是更新,而是模式验证(使用https://github.com/aldeed/meteor-simple-schema)。
我禁用了数组中对象的模式检查(该方法在服务器上,因此在这种情况下不安全验证)。现在更新所有30个文档需要<1ms。
不确定架构验证为何如此缓慢。