MongoDB更新Shell命令应该是什么?

4
这是我的收藏中的一份文件。
{   
    "_id": ObjectId("55e86e98f493590878bb45d7"),
    "KIDS_M_0_2" : "",
    "KIDS_F_0_2" : "",
    "KIDS_U_0_2" : "Y",
    "KIDS_M_3_5" : "",
    "KIDS_F_3_5" : "",
    "KIDS_U_3_5" : "Y",
    "KIDS_M_6_10" : "",
    "KIDS_F_6_10" : "",
    "KIDS_U_6_10" : "",
    "KIDS_M_11_15" : "",
    "KIDS_F_11_15" : "",
    "KIDS_U_11_15" : "",
    "KIDS_M_16_17" : "",
    "KIDS_F_16_17" : "",
    "KIDS_U_16_17" : "Y"
}

我希望这个像这样。
{
    "_id":ObjectId("55e86e98f493590878bb45d7"),
    "KIDS": { "KIDS_M_0_2" : "",
    "KIDS_F_0_2" : "",
    "KIDS_U_0_2" : "Y",
    "KIDS_M_3_5" : "",
    "KIDS_F_3_5" : "",
    "KIDS_U_3_5" : "Y",
    "KIDS_M_6_10" : "",
    "KIDS_F_6_10" : "",
    "KIDS_U_6_10" : "",
    "KIDS_M_11_15" : "",
    "KIDS_F_11_15" : "",
    "KIDS_U_11_15" : "",
    "KIDS_M_16_17" : "",
    "KIDS_F_16_17" : "",
    "KIDS_U_16_17" : "Y"
}

这可以通过shell完成吗?我的更新命令应该是什么?
1个回答

1
实际上,您需要更多的命令。您需要使用 .find() 方法返回的游标循环遍历,使用 .forEach() 方法创建一个名为“kids”的新对象,其中包含字段名称和它们的值。下一步要做的是$unset所有字段并使用$set运算符创建新字段。当然,为了达到最大效率,您需要使用"bulk"1操作。
var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0; 

db.collection.find().forEach(function(doc) {
    var kids = {}; 
    for(key in doc) {
        if(key != '_id' && Object.prototype.hasOwnProperty.call(doc, key)) {
            kids[key] = doc[key];
            var unset = {};         
            unset[key] = '';         
            bulk.find( { '_id': doc._id } ).updateOne( { '$unset': unset } );
            count++;    
        }        
        bulk.find( { '_id': doc._id } ).updateOne({ '$set': { 'KIDS': kids } } ); 
        if (count % 500 === 0) {
            bulk.execute();     
            bulk = db.collection.initializeUnorderedBulkOp(); 
        }
})

if (count > 0)  
    bulk.execute()

这个操作后,您的文档看起来像这样:
{
        "_id" : ObjectId("567d99bcbc08a0817a1b06dd"),
        "KIDS" : {
                "KIDS_M_0_2" : "",
                "KIDS_F_0_2" : "",
                "KIDS_U_0_2" : "Y",
                "KIDS_M_3_5" : "",
                "KIDS_F_3_5" : "",
                "KIDS_U_3_5" : "Y",
                "KIDS_M_6_10" : "",
                "KIDS_F_6_10" : "",
                "KIDS_U_6_10" : "",
                "KIDS_M_11_15" : "",
                "KIDS_F_11_15" : "",
                "KIDS_U_11_15" : "",
                "KIDS_M_16_17" : "",
                "KIDS_F_16_17" : "",
                "KIDS_U_16_17" : "Y"
        }
}

MongoDB 3.2 弃用 Bulk() 及其相关方法,并提供了 .bulkWrite() 方法。

var operations = [];

db.collection.find().forEach(function(doc) { 
    var kids = {}; 
    for(var key in doc) { 
        if(!key.startsWith('_id') && Object.prototype.hasOwnProperty.call(doc, key)) { 
            kids[key] = doc[key];
            var unset = {};
            unset[key] = ''; 
            operations.push(
                { 'updateOne': 
                    { 
                        'filter': { '_id': doc._id } ,         
                        'update': { '$unset': unset } 
                    }             
                }         
            );    
        }     
        operations.push(         
            { 'updateOne':              
                { 
                    'filter': { '_id': doc._id } ,              
                    'update': { '$set': { 'KIDS': kids } } 
                }         
            }     
        ); 
    } 
    operations.push( { 'ordered': true } ); 
})

db.collection.bulkWrite(operations)

1. Bulk() API是2.6版本中新增的。因此,如果您使用的是旧版本,应考虑升级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接