将字段的字符串值转换为新密钥的字符串值:MongoDB汇总中的同一文档中的值项

问题描述 投票:0回答:1

集合的样本文档

DB: MYDB
Collection: MYCOLL
{
    "_id": {
      "$oid": "678a78375cb6955814197272"
    },
    "ID": 1019397,
    "INFO": "A=5242;AF=987;C=82622"
}
{
    "_id": {
      "$oid": "678a78375cb6955814197272"
    },
    "ID": 1019397,
    "INFO": "A=h242;AF=9y87;C=8w622"
}
我想预期输出如下:

{ "_id": { "$oid": "678a78375cb6955814197272" }, "ID": 1019397, "INFO": "A=5242;AF=987;C=82622", "A":"5242", "AF":"987", "C":"82622" }
我已经尝试自己做,但是现在我为CSV中的特定值创建了以下汇总代码。这不是我想做的。您能告诉我如何以上面显示的形式使其在性能和创建(更新当前的收集文档)方面更好?
db["MYCOLL"].aggregate([ { $project: { INFO_ARR: { $split:["$INFO",";"] } } }, { $project: { AF_ARR: { $arrayElemAt: [ "$INFO_ARR" , 1 ] } } }, { $project: { AF_FREQ_ARR: { $split: [ "$AF_ARR" , "=" ]} } }, { $project: { AF: { $arrayElemAt: [ "$AF_FREQ_ARR" , 1 ] } } }, { $merge : { into: { db: "MYDB", coll: "MYCOLL" }, on: "_id", whenMatched: "merge", whenNotMatched: "insert" } } ])

注:我无法使用JavaScript,因为该集合的尺寸为400GB,并且具有数百万个记录。因此,JavaScript可能太慢了,无法更新所有记录。我对此错了吗?
	

您可以使用以下聚合管道来拆分

INFO
mongodb mongodb-query aggregation-framework
1个回答
0
投票

[ { $project: { INFO: 1 } }, { $set: { info_arr: { "$split": [ "$INFO", ";" ] } } }, { $set: { info_arr2: { "$map": { "input": "$info_arr", "in": { k: { $first: { $split: [ "$$this", "=" ] } }, v: { $last: { $split: [ "$$this", "=" ] } } } } } } }, { $set: { info_obj: { "$arrayToObject": "$info_arr2" } } }, { "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$$ROOT", "$info_obj" ] } } }, { $unset: [ "info_arr", "info_arr2", "info_obj" ] } ]


管道首先将字段内容分配在分号上,然后在平等标志处分配单个线,并将键分配给一个字段,值将键(值)为
k
字段。
    在这一点上,
  • v
    运算符用于从数组内容创建对象。
    
    后,将新创建的子文档的属性与
    $arrayToObject
    文档合并。
  • 末端,使用
  • $$ROOT
    级去除临时属性。
    
  • 请参阅此
  • Playground
    进行测试。
        
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.