如何转换集合中所有文档中的许多字段的类型?

时间:2013-12-29 23:56:42

标签: mongodb

在从CSV进行mongoimport后,我最终将大量布尔字段存储为字符串。 字符串值全部为“TRUE”,“FALSE”或为空。

如何将这些字段转换为适合整个集合的布尔值?

3 个答案:

答案 0 :(得分:0)

在mongodb shell中你可以使用以下语句

db.collection.find({"Fieldname":"TRUE"}).forEach(function(a){a.Fieldname=true; db.collection.save(a)})

db.collection.find({"Fieldname":"False"}).forEach(function(a){a.Fieldname=false; db.collection.save(a)})

这样你可以将它从字符串更改为布尔值。

答案 1 :(得分:0)

虽然您可以使用$set做一些非常有效的事情(虽然您正在将string的数据大小的性质改为boolean s),但我会去在这种情况下很简单。

从MongoDB控制台,您可以使用以下代码:

db.myCollection.find().forEach(function(doc) { 
      var changed = false;
      // loop through all fields, looking for "TRUE" or "FALSE"
      for(var field in doc) {
         var value = doc[field];
         if (value === "TRUE") { 
             doc[field] = true; 
             changed = true;
         } else if (value === "FALSE") {
             doc[field] = false;
             changed = true;
         } else if (value === "" || value === null ) {
             // remove empty
             delete doc[field];
             changed = true;
         }
      }
      // continue pattern checking more fields if needed

      if (changed) {    // if something changed, update the entire document
          db.myCollection.update({_id: doc._id}, doc);
      }
});

答案 2 :(得分:-1)

遍历应转换的不同字段,并生成包含当前键和应转换的值的查询。对于与查询匹配的每个文档,将字符串值替换为布尔值。

var boolean_fields = ['Key_a1','Key_a2', ..,'Key_an'];
var queryFunction = function(key, value){
    var expression = {};
    expression[key] = value;
    return expression;
}

boolean_fields.forEach(function(fieldname, index, array) {

    db.products.find( queryFunction(fieldname, "TRUE") ).forEach( function (match) {
      match[fieldname] = true; // convert field to boolean
      db.products.save(match);
    });

    db.products.find( queryFunction(fieldname, "FALSE") ).forEach( function (match) {
      match[fieldname] = false; // convert field to boolean
      db.products.save(match);
    });

    db.products.find( queryFunction(fieldname, "") ).forEach( function (match) {
      match[fieldname] = null; // remove string type
      db.products.save(match);
    });    

});