database - 我需要优化 mongo 集合更新
问题描述
我需要编写一个脚本,将一个新字段写入我的集合中的嵌入对象。假设我的集合名称是 Proposition,它包含 100000 个文档,它看起来像这样:
[{
"Id": "1111",
"name":"Name",
"products": [
{
"productId": "P1",
},{
"productId": "P2",
}]
}]
我的目标是为每个产品添加一个名为 parent 的新字段:
[{
"Id": "1111",
"name":"Name",
"products": [
{
"productId": "P1",
**"parent": "parent1"**
},{
"productId": "P2",
**"parent": "Parent2"**
}]
}]
我需要从另一个名为 Products 的集合中获取父字段,如下所示
[{
"productId": "P1",
"parent": "parent1"
},
{
"productId": "P2",
"parent": "Parent2"
}]
因此脚本需要从 Product 集合中获取 productId 和与之相关的父级,然后通过添加父字段来更新包含该产品的命题集合。
我知道的脚本:
db.Products.find()
.toArray()
.forEach(function(product){
updateWithParentID(product.productId,product.parent)
})
function updateWithParentID(prosuctId,parent){
db.Propositions.updateOne(
{'products.productId':prosuctId},
{$set:{"products.$.parent":parent}})
}
它的工作,但不幸的是它需要很多时间,所以我想知道是否有更好和有效的方法来执行此更新
谢谢你。
解决方案
我建议使用 bulkWrite 功能。这将通过消除每次更新往返的大部分网络延迟来减少总体时间......
var batch=[];
db.Products.find().toArray().forEach(function(product) {
batch.push(
{
updateOne: {
"filter": { "products.productId": product.productId },
"update": { "$set": { "products.$.parent": product.parent } }
}
}
);
});
db.Propositions.bulkWrite(batch, { ordered: false } );
就准确性而言,您没有提供太多数据进行测试。您可能会发现需要使用 arrayFilters。
推荐阅读
- jenkins - 如何获取安装特定插件的 Jenkins 用户?
- asynchronous - 无法让计算在颤振上工作
- c# - 在鼠标悬停的图像标签中放大图像
- firebase - Firebase Google Auth 离线 access_type 以获取 refresh_token
- sympy - 如何在 sympy 中扩展具有多个变量的对数?
- php - 收到新请求时中止繁重的 apache 请求
- sql - 具有 oracle 数据库表的搜索引擎
- c++ - 如何使用 c++ 中的 ipp 库从信号中生成 fft?
- javascript - offset().top 在附加元素上没有返回正确的值
- apache-kafka-streams - 更改 KStream 的滑动窗口应用程序的窗口大小\跳数