我有一个mongo集合,其中的文档具有以下结构:
item{
data{"emailBody":
"{\"uniqueKey\":\" this is a stringified json\"}"
}
}
我想要做的是使用' uniqueKey'作为一个索引字段,做一个"内部连接"等同于不同集合中的项目。
我正在考虑在所有文档上运行循环 - >解析json - >将它们保存为名为" parsedEmailBody"。
的新属性有没有更好的方法来处理mongo中的字符串化json?
答案 0 :(得分:2)
唯一的方法是遍历集合,将字段解析为JSON并在循环中更新文档:
db.collection.find({ "item.data.emailBody": { "$type": 2 } })
.snapshot().forEach(function(doc){
parsedEmailBody = JSON.parse(doc.item.data.emailBody);
printjson(parsedEmailBody);
db.collection.updateOne(
{ "_id": doc._id },
{ "$set": { "item.data.parsedEmailBody": parsedEmailBody } }
);
});
对于大型集合,请使用批量API来利用更新:
var cursor = db.collection.find({ "item.data.emailBody": { "$type": 2 } }).snapshot(),
ops = [];
cursor.forEach(function(doc){
var parsedEmailBody = JSON.parse(doc.item.data.emailBody);
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "item.data.parsedEmailBody": parsedEmailBody } }
}
});
if (ops.length === 500) {
db.collection.bulkWrite(ops);
ops = [];
}
});
if (ops.length > 0) { db.collection.bulkWrite(ops); }