我有一个集合,它有一个名为“code”的键,它的值有时是数据类型为 new Mongoint32(5) 的数字,有时是字符串,如“abcd”。我的数据库中已经有这两个值。我想要的是把它们变成一个单一的,即一个字符串。是否可以编写和更新查询以使 mongoint32 类型为 string ?
谢谢哈里克里希纳
我有一个集合,它有一个名为“code”的键,它的值有时是数据类型为 new Mongoint32(5) 的数字,有时是字符串,如“abcd”。我的数据库中已经有这两个值。我想要的是把它们变成一个单一的,即一个字符串。是否可以编写和更新查询以使 mongoint32 类型为 string ?
谢谢哈里克里希纳
如果您使用的是 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" }
我同意 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 的说明进行更新。