通过拆分字段值来重塑文档

2023-11-30

假设我们有一组原始数据:

{ "person": "David, age 102"}
{ "person": "Max, age 8" }

我们希望将该集合转换为:

{ "age": 102 }
{ "age": 8 }

仅使用 mongo(d) 引擎。 (如果所有人名或年龄都具有相同的长度, $substr 可以完成这项工作,)这可能吗?

假设正则表达式很简单 /\d+/


MongoDB 3.4 版本中的最佳方式。

这个版本的mongod提供了$split运算符,当然,它会分割字符串,如图所示here.

然后我们使用以下方法将新计算的值分配给变量$let变量运算符。然后可以在以下位置使用新值in表达式使用以下命令返回“姓名”和“年龄”值$arrayElemAt运算符返回指定索引处的元素;0对于第一个元素和-1对于最后一个元素。

请注意,在in表达式我们需要拆分最后一个元素才能返回整数字符串。

最后我们需要迭代Cursor对象并使用将整数字符串转换为数字Number or parseInt并使用批量操作和bulkWrite()方法$set这些字段的值可实现最大效率。

let requests = [];
db.coll.aggregate(
    [
        { "$project": {  
            "person": { 
                "$let": { 
                    "vars": { 
                        "infos":  { "$split": [ "$person", "," ] } 
                    }, 
                    "in": { 
                        "name": { "$arrayElemAt": [ "$$infos", 0 ] }, 
                        "age": { 
                            "$arrayElemAt": [ 
                                { "$split": [ 
                                    { "$arrayElemAt": [ "$$infos", -1 ] }, 
                                    " " 
                                ]}, 
                                -1 
                            ] 
                        } 
                    } 
                } 
            }  
        }}
    ] 
).forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.person.name, 
                    "age": Number(document.person.age) 
                },
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 ops and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

 // Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB 3.2 或更高版本。

MongoDB 3.2 弃用旧版本Bulk()API及其相关methods并提供bulkWrite()方法,但它没有提供$split运算符,所以我们这里唯一的选择是使用mapReduce()方法来转换我们的数据,然后使用批量操作更新集合。

var mapFunction = function() { 
    var person = {}, 
    infos = this.person.split(/[,\s]+/); 
    person["name"] = infos[0]; 
    person["age"] = infos[2]; 
    emit(this._id, person); 
};

var results = db.coll.mapReduce(
    mapFunction, 
    function(key, val) {}, 
    { "out": { "inline": 1 } }
)["results"];

results.forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.value.name, 
                    "age": Number(document.value.age) 
                }, 
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 operations and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

// Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB 版本 2.6 或 3.0。

我们需要使用现在已弃用的Bulk API.

var bulkOp = db.coll.initializeUnorderedBulkOp();
var count = 0;

results.forEach(function(document) { 
    bulkOp.find({ "_id": document._id}).updateOne(
        { 
            "$set": { 
                "name": document.value.name, 
                "age": Number(document.value.age)
            },
            "$unset": { "person": " " }
        }
    );
    count++;
    if (count === 500 ) {
        // Execute per 500 operations and re-init
        bulkOp.execute();
        bulkOp = db.coll.initializeUnorderedBulkOp();
    }
});

// clean up queues
if (count > 0 ) {
    bulkOp.execute();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过拆分字段值来重塑文档 的相关文章

随机推荐

  • 如何使用 Selenium RC 保存和恢复所有 cookie?

    我正在运行复杂的测试 为网站的不同部分创建许多 cookie 有时 我必须在长时间测试中重新启动浏览器 并且由于 Selenium 服务器不会修改基本 Firefox 配置文件 因此 cookie 会消失 有什么方法可以在终止浏览器之前将所
  • List 不是 List

    我有一个 Cloud Firebase 数据库 其中包含questions收藏 每个question有一个地图列表options 我正在使用 Flutter 并有以下课程question and option class Question
  • 如何使用 JavaScript 停止文件上传事件

    当我上传的文件超过 5mb 或者我的文件扩展名不是时 我想停止文件上传事件 jpg or png 我找到了一个代码 但是当我尝试上传无效的文件类型时 它只会提醒我上传了错误的文件 但不会取消该事件 这是代码
  • pxssh 抛出文件结尾 (EOF)。异常样式平台异常

    我在使用 pxssh 模块时遇到问题 我的代码如下 try ssh handle pxssh pxssh timeout None ssh handle logfile sys stdout ssh handle login host us
  • Kotlin函数用于获取子字符串的开始和结束索引

    我想知道是否有一些方法或方法组合可以获得这些结果 我的意思是你有一个字符串 ex Hello world how are you 我想实现以下功能 获取子字符串的开始和结束索引 在那根弦里 前任 substring world 起始索引为
  • 如何对小数位进行分组?

    我想要得到x 1 234 567 890 098 765 432 1 include
  • 更改 Chrome 状态栏中显示的 URL

    当我将鼠标悬停在 Chrome 中的某个网址上时 该网址会显示在 Chrome 状态栏中 就我而言 这会导致丑陋的 javascript bla bla bla 引用 当您将鼠标悬停在链接上时 有什么方法可以更改状态栏的内容吗 Thanks
  • 如何设置静态资源的依赖属性?

    我试图解决我无法指定动态值的事实ConverterParameter 请参阅我的其他问题 了解为什么我需要将动态值绑定到ConverterParameter 我不喜欢当前发布的解决方案 因为它们都需要我认为对我的视图模型进行不必要的更改 为
  • Tumblr 音频播放器无法通过无限滚动加载

    我在这个 tumblr 上实现了无限滚动和砌体 检查链接的修订版 音频播放器不会出现在通过无限滚动加载的帖子中 而是显示文本 需要 Flash 9 才能收听音频 Inspire Well tumblr 主题 我无法发布另一个超链接 但你可以
  • KnpMenuBundle - 发送选项并在 Twig 中使用它们

    我在 KnpMenuBundle 的导航栏菜单上写下了最后几天的内容 我只想简单地给模板一些参数 然后对其做出反应 是否可以 我试过这个 menu gt addChild Registration array route gt fos us
  • 如何在Python中替换列表中的单引号

    我有一个清单 my list 3 45 12 6 该列表包含单引号和双引号以及项目值 如何替换每个项目中的单引号或双引号 我尝试了下面 但结果是一样的 my list i replace for i in my list 您的列表不包含任何
  • 在 C++ 中,表达式“*pointer++”如何工作? [复制]

    这个问题在这里已经有答案了 include
  • htaccess自动检测域名

    我制作了自动创建子域的脚本 htaccess 工作正常 但问题是 在新域上安装时我需要手动更改域名 我想在htaccess中自动检测域名 可以吗 因此 当添加另一台服务器或新域时 无需再次更改域根htaccess 域根 htaccess 是
  • 类型错误:EventEmitter 不是新 MapboxGeocoder 的构造函数

    使用Vue 3 typescript vite 已经用Vite Vue 3 typescript搭建了项目 使用谷歌地图时遇到麻烦 因为它需要付费 然后尝试了 Mapbox 地图部分工作正常 但在添加 MapboxGeocoder 时显示错
  • iOS 快速发布请求

    所以我想创建一个具有以下输出的发布请求 user gt email gt email protected password gt FILTERED password confirmation gt FILTERED 相反 我得到 user
  • PHP:“遇到格式不正确的数值”

  • Google App Engine JDO 使持久延迟

    我的 Google App Engine JDO 实现存在问题 我无法弄清楚 文档 http code google com intl sv SE appengine docs java datastore jdo creatinggett
  • 无法通过 Spark 连接到 Mongo DB

    我正在尝试通过 Apache Spark master 从 Mongo DB 读取数据 我为此使用了 3 台机器 M1 上面有一个 Mongodb 实例 M2 带有 Spark Master 带有 Mongo 连接器 在其上运行 M3 带有
  • 为什么按这个顺序列出 monad 组合?

    我正在阅读有关列表单子的内容并遇到 1 2 gt gt n gt a b gt gt ch gt return n ch 它产生 1 a 1 b 2 a 2 b 我是这样理解的 隐式括号是 1 2 gt gt n gt a b gt gt
  • 通过拆分字段值来重塑文档

    假设我们有一组原始数据 person David age 102 person Max age 8 我们希望将该集合转换为 age 102 age 8 仅使用 mongo d 引擎 如果所有人名或年龄都具有相同的长度 substr 可以完成