MongoDB更改了DBref

时间:2012-01-24 10:12:44

标签: json mongodb database

有没有办法更改MongoDB集合引用? 随着变化,我的意思是参考中的值。 我不能只创建一个直接链接,因为数据库正在使用中。 我的结构看起来像这样

{
        "_id" : ObjectId("4e7c6b47e4b0dea06288ad21"),
        "license" : "ABC123",
        "model" : "911",
        "make" : "Porsche",
        "owner" : {
                "$ref" : "users",
                "$id" : "Test User"
        }
}

我想更改ID

{ "$ref" : "users", "$id" : "NEW USER"}

2 个答案:

答案 0 :(得分:3)

当然可以,但你不能用直接的套装来做到这一点:

> db.test.save({a:{$ref:"users", $id:"Test User"}})
> db.test.find()
{ "_id" : ObjectId("4f1e85489d086ee4511551b6"), "a" : DBRef("users", "Test User") }
> db.test.update({}, {$set:{'a.$id':"NEW USER"}})
> db.test.find()
{ "_id" : ObjectId("4f1e85489d086ee4511551b6"), "a" : { "$id" : "NEW USER", "$ref" : "users" } }

正如您所看到的,这会破坏引用,因为DBRef规范要求$ ref和$ id字段的顺序为$ ref。

你可以这样更新:

> db.test.update({}, {$set:{a:{$ref:"users", $id:"NEW USER"}}})
> db.test.find()
{ "_id" : ObjectId("4f1e858b9d086ee4511551b7"), "a" : DBRef("users", "NEW USER") }

如果你在shell中,或者只使用“new DBRef(..)”。

答案 1 :(得分:0)

就我个人而言,我已经开始完全避免使用DBRef,因为它增加了许多不必要的开销,因为在我的情况下," user"字段在同一个集合中,使得DBRef的第一部分减少。

所以我会迁移到一个新领域(让我们说" ownerId")并直接将ObjectId存储在那里。显然,您可能需要对用户对象进行一些手动检索,但这取决于您的应用程序框架。