Mongodb更新查询保持值和更新数据类型



我有一个集合,它有一个名为"code"的键,它的值有时是一个数据类型为new Mongoint32(5)的数字,有时是字符串,如"abcd"。我有两个值已经在我的数据库。我想要的是把它们变成一个字符串。是否可以编写和更新查询,使mongoint32类型为字符串?

谢谢哈里克里希纳

如果您正在使用shell,您可以执行find/forEach循环来更新它们。

要将集合test中名为value的字段从int(类型1)更新为string,您可以执行;

> db.test.find()
{ "_id" : ObjectId("51b83850399aace88ba102d0"), "bop" : "olle", "value" : 1 }
{ "_id" : ObjectId("51b8385b399aace88ba102d2"), "bop" : "pelle" }
{ "_id" : ObjectId("51b83860399aace88ba102d3"), "bop" : "kjell", "value" : "wow" }
> db.test.find({value: {$type:1}}).forEach(function(item) { 
                                     item.value=""+item.value; 
                                     db.test.save(item);
                                   });
{ "_id" : ObjectId("51b83850399aace88ba102d0"), "bop" : "olle", "value" : "1" }
{ "_id" : ObjectId("51b8385b399aace88ba102d2"), "bop" : "pelle" }
{ "_id" : ObjectId("51b83860399aace88ba102d3"), "bop" : "kjell", "value" : "wow" }

我同意Joachim Isaksson的回答,我会改变find()使用一个查询,只找到那些真正包含该字段的文档(因为你可能有文档没有它- MongoDB是无模式的),而且,只找到那些相关字段类型不是字符串的文档。

示例:

// push few docs
db.so.insert({"a":1})
db.so.insert({"a":2})
db.so.insert({"a":"3"})
db.so.insert({"dontFindMe":4})
// this is the filter that make the different
db.so.find({$and:[{a:{$exists:true}},{a:{$not:{$type:2}}}]})

这将只找到相关的文档,您将避免不必要的更新操作。
拿到相关文档后,按照Joachim Isaksson的解释进行更新。

最新更新