gpt4 book ai didi

javascript - 通过拆分字段值来 reshape 文档

转载 作者:可可西里 更新时间:2023-11-01 09:13:31 24 4
gpt4 key购买 nike

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

{ "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 返回“name”和“age”值。运算符返回指定索引处的元素; 0 表示第一个元素,-1 表示最后一个元素。

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

最后我们需要迭代 Cursor 对象并使用 Number 将整数字符串转换为数字字符串。或 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();
}

关于javascript - 通过拆分字段值来 reshape 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37036327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com