将现有MongoDB字符串属性转换为BSON :: ObjectId

时间:2012-04-23 20:40:22

标签: mongodb mongoid

我在MongoDB中有一个文档集合,如果将它保存为BSON :: ObjectId,则该属性存储为字符串,如果它保存为BSON :: ObjectId则会更好。

集合名称为foo,字段名为bar。让每个字段bar将其现有值转换为BSON :: ObjectId的实例的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

这是什么意思? (你有一个字符串是ObjectId的十六进制,你想把它变成一个ObjectId)

> db.foo.insert({bar:new ObjectId().str});
> db.foo.insert({bar:new ObjectId().str});
> db.foo.insert({bar:new ObjectId().str});
> db.foo.find();
{ "_id" : ObjectId("4f95e00d9060633ce7fbab94"), "bar" : "4f95e00d9060633ce7fbab93" }
{ "_id" : ObjectId("4f95e0119060633ce7fbab96"), "bar" : "4f95e0119060633ce7fbab95" }
{ "_id" : ObjectId("4f95e0119060633ce7fbab98"), "bar" : "4f95e0119060633ce7fbab97" }
> db.foo.find().forEach(function(doc) { db.foo.update({_id:doc._id},{$set:{bar:new ObjectId(doc.bar)}}); });
> db.foo.find();
{ "_id" : ObjectId("4f95e00d9060633ce7fbab94"), "bar" : ObjectId("4f95e00d9060633ce7fbab93") }
{ "_id" : ObjectId("4f95e0119060633ce7fbab96"), "bar" : ObjectId("4f95e0119060633ce7fbab95") }
{ "_id" : ObjectId("4f95e0119060633ce7fbab98"), "bar" : ObjectId("4f95e0119060633ce7fbab97") }

或者这就是你的意思? (你有一个字符串,但你想把它吹掉并在它的位置创建一个新的ObjectId)

> db.foo.insert({bar:"some string id"});
> db.foo.insert({bar:"some string id2"});
> db.foo.insert({bar:"some string id3"});
> db.foo.find();
{ "_id" : ObjectId("4f95e1779060633ce7fbaba5"), "bar" : "some string id" }
{ "_id" : ObjectId("4f95e1799060633ce7fbaba6"), "bar" : "some string id2" }
{ "_id" : ObjectId("4f95e17b9060633ce7fbaba7"), "bar" : "some string id3" }
> db.foo.find().forEach(function(doc) { db.foo.update({_id:doc._id},{$set:{bar:new ObjectId()}}); });
> db.foo.find();
{ "_id" : ObjectId("4f95e1779060633ce7fbaba5"), "bar" : ObjectId("4f95e1819060633ce7fbaba8") }
{ "_id" : ObjectId("4f95e1799060633ce7fbaba6"), "bar" : ObjectId("4f95e1819060633ce7fbaba9") }
{ "_id" : ObjectId("4f95e17b9060633ce7fbaba7"), "bar" : ObjectId("4f95e1819060633ce7fbabaa") }

答案 1 :(得分:1)

我认为您无法更改对象ID,但您可以执行以下操作:

db.whatevers.find().forEach(function(x) {
   x.oldId = x._id; // this can be handy :)
   x._id = new ObjectID();
   db.whatevers.insert(x);
})

db.whatevers.remove({oldId:{$exists:false}}};