如何在MongoDB中将字符串转换为布尔值?

时间:2015-04-16 06:20:53

标签: mongodb mongodb-query

我是mongo的新手,请原谅我,如果这是一个无聊的问题。我错误地使用“true”/“false”(类型字符串)更新了mongo中的特定标志。我想要一个查询,以便我可以更新我的集合并将标志的类型从字符串“true”更改为布尔值true。

示例:

{flag: "true"} to { flag : true}

所以我有两个问题:

  1. 我可以使用查询吗?
  2. 如果我可以,怎么样?

4 个答案:

答案 0 :(得分:5)

对于相对较小的集合,如果字段类型为字符串,则执行更新:

db.collection.find({ "flag": { $type : 2 } }).forEach(function (doc){   
    var isTrueSet = (doc.flag === "true");
    doc.flag = isTrueSet; // convert field to Boolean
    db.collection.save(doc);
});

对于中型/大型馆藏,您可以使用 bulkWrite API作为

var cursor = db.collection.find({ "flag": { "$exists": true, "$type": 2 } }),
    ops = [];

cursor.forEach(function(doc){ 
    var isTrueSet = (doc.flag === "true");
    ops.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "flag": isTrueSet } }
         }
    });

    if (ops.length == 1000) {
        db.collection.bulkWrite(ops);
        ops = [];
    }
});         

if (ops.length > 0) { db.collection.bulkWrite(ops); }

答案 1 :(得分:3)

只需调用这两个查询:

db.coll.update({
   flag: "true"
}, {
   $set: {flag: true}
}, { multi: true })

db.coll.update({
   flag: "false"
}, {
   $set: {flag: false}
}, { multi: true })

第一个将所有"true"更改为true,其次,您将获得它。

对于中/大集合,这将比已建议的foreach声明明显更快地运行

答案 2 :(得分:1)

MongoDB Manual - Modify Documents。例如:

db.collectionName.update({_id: "yourid"}, {$set: {flag : true}})

答案 3 :(得分:0)

可以使用$toBool运算符在MongoDB v4.0中将字符串转换为布尔值。在这种情况下

db.col.aggregate([
    {
        $project: {
            _id: 0,
            flagBool: { $toBool: "$flag" }
        }
    }
])

输出:

{ "flagBool" : true }