一、多集合关联更新数据
//新增字段
//新建集合
db.createCollection('workjsoninfo8');
//把新集合数据更新进旧集合
db.workjsoninfo8.find({});
//管道函数查数据/刷新数据
db.workjsoninfo8.aggregate(
[
{
$lookup:{
from:"workjsoninfo",//要查询的集合
localField:"WorkOrderId",//localField是当前集合的字段
foreignField:"WorkOrderId",//foreignField是要查询集合的字段,这两个字段应该是类型和数据相同的。
as:'WorkOrder'//保存查询结果的字段名。
}
}
,
{$match:{WorkOrder:{$ne:[]},"WorkOrder.WorkAddressInfo":null}}//筛选结果字段不为空(关联到)
,
{$project:{WorkOrderId:1,workaddressinfo:1}} //展示WorkOrderId和WorkOrder.workaddressinfo
//, {$count:"num"} //137486
]).
forEach(function(item){
db.workjsoninfo.update({WorkOrderId:item.WorkOrderId,WorkAddressInfo:null},{$set:{WorkAddressInfo:item.workaddressinfo}})
});
//刷新数据
//数据量过大时会报错 cusor id not found
/*主要原因:
默认 mongo server维护连接的时间窗口是十分钟
默认 单次从 server获取数据是101条或者 大于1M小于16M的数据
所以默认情况下,如果10分钟内未能处理完数据,则抛出该异常
batchSize有用,但不完全有用*/
db.workjsoninfo8.find({}).forEach(
function(item){
db.workjsoninfo.updateMany(
{WorkOrderId:item.WorkOrderId },
{$set:{WorkAddressInfo:item.workaddressinfo}}
)
}
);
//刷为数组
db.workjsoninfo.find(
{'WorkAddressInfo.Id':null,WorkAddressInfo:{$ne:null}}
).forEach(function (el){
el.WorkAddressInfo=JSON.parse(el.WorkAddressInfo);
db.workjsoninfo.save(el)
});
//统计更新后地址数据
db.workjsoninfo.aggregate(
[
{
$group:{
_id:{WorkAddressInfo:"$WorkAddressInfo"},//根据WorkAddressInfo分组
count:{$sum:1}
}
}
]);
db.workjsoninfo.find({'WorkAddressInfo.Id':null,WorkAddressInfo:{$ne:null}}).count();//有多少条WorkAddressInfo