【问题标题】:Convert existing MongoDB string attribute to BSON::ObjectId将现有的 MongoDB 字符串属性转换为 BSON::ObjectId
【发布时间】:2012-05-04 12:02:18
【问题描述】:

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

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

【问题讨论】:

标签: mongodb mongoid


【解决方案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}}};

【讨论】:

    【解决方案2】:

    这是你的意思吗? (你有一个 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") }
    

    【讨论】:

    • 您能否为未来的读者澄清这两种方法之间的区别以及 OP 可能选择它的原因?脱离上下文,在两个答案之间进行随机选择并没有太大帮助。 :)
    • 完成。我部分希望他能澄清一下,这样我就可以删除我的一个答案,但我想两者兼而有之可能会有用。
    • 嗨,韦斯。我的对象已经是字符串格式的十六进制表示。我只需要将现有字符串更新为 ObjectId 的实例。最好进行就地更新,而不必重新插入所有文档并删除旧文档。
    • 是的,这就是我的第一个脚本所做的:db.foo.find().forEach(function(doc) { db.foo.update({_id:doc._id},{$set:{bar:new ObjectId(doc.bar)}}); });
    • 请注意,如果您的“bar”属性恰好是“_id”(如我的情况),则不能这样做,即,您不能在 MongoDB 中更新 _id - 请参阅 @987654321 @.
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2011-12-11
    • 2018-11-09
    • 2014-04-20
    • 2017-03-11
    • 1970-01-01
    • 2021-11-26
    • 2023-03-19
    相关资源
    最近更新 更多