流星集合(MongoDB)更新性能非常差

时间:2015-11-19 17:40:44

标签: mongodb meteor mongodb-query database-performance

我在优化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}`);
                }
            });
        });

    });
}

1 个答案:

答案 0 :(得分:1)

原来这个问题实际上不是更新,而是模式验证(使用https://github.com/aldeed/meteor-simple-schema)。

我禁用了数组中对象的模式检查(该方法在服务器上,因此在这种情况下不安全验证)。现在更新所有30个文档需要<1ms。

不确定架构验证为何如此缓慢。