Mongo:将json字符串移动到文档的一部分

时间:2017-03-29 10:06:10

标签: json mongodb

我有一个mongo集合,其中的文档具有以下结构:

item{
    data{"emailBody":
           "{\"uniqueKey\":\" this is a stringified json\"}"
    }
}

我想要做的是使用' uniqueKey'作为一个索引字段,做一个"内部连接"等同于不同集合中的项目。

我正在考虑在所有文档上运行循环 - >解析json - >将它们保存为名为" parsedEmailBody"。

的新属性

有没有更好的方法来处理mongo中的字符串化json?

1 个答案:

答案 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); }