Mongodb更新查询保留值并更新数据类型

时间:2013-06-12 08:41:33

标签: mongodb

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

感谢 哈里克里希纳

2 个答案:

答案 0 :(得分:2)

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

要将集合value中名为test的字段从int(类型1)更新为字符串,您可以这样做;

> 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" }

答案 1 :(得分:1)

我同意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}}}]})

这将只找到相关的2个文档,您将避免不必要的更新操作 在您掌握了相关文档后,将其更新为与Joachim Isaksson解释的相同。