MongoDB Cross-db DBRef在2.4中

时间:2013-11-10 03:36:48

标签: mongodb mongodb-php

我在本地运行MongoDB 2.4.6,而MongoDB PECL扩展是1.4.3,同时测试它。

我目前正在开发一个包含两个MongoDB数据库的应用程序,一个名为nc_main,名为companies,另一个名为nc_test,名为{{1} }}。我尝试对其进行设置,以便users文档可以引用companies文档,但它似乎并不适用于我。当我查看公司文档时,我看到:

users

但是,DBRef是使用以下代码在PHP中设置的:{ "_id" : ObjectId("xxxx"), "maintainer" : DBRef("users", ObjectId("yyyy")) }

我可以运行以下查询,但它不会更改我在查询文档时看到的内容:MongoDBRef::create('users', $user['id'], 'nc_test');

这导致的问题是,尝试通过引用加载db.companies.update({ _id: ObjectId("xxxx") }, { $set: { maintainer: { "$ref": "users", "$id": ObjectId("yyyy"), "$db": "nc_test"} }})文档会导致文档找不到错误,因为它在users数据库中而不是nc_main数据库中查找1}}就像我试图告诉它一样。

1 个答案:

答案 0 :(得分:1)

请注意,shell不支持MongoDBRef的$ db字段名,这就是为什么它不显示在那里(并且想到它,它看起来像shell中的一个错误,它甚至将数据转换为DBRef JavaScript对象)。

此外,MongoDBRef不是其他任何约定。它不是神奇的,不会进行任何“自动获取”或“自动扩展”,它只是许多人用来“链接”同一集合中的文档的约定 - 在某些情况下,跨数据库。并非所有ODM(或那些重要的驱动程序)都支持$ db字段名。

话虽如此,这是一个很好的约定 - 但我不能完全看出哪些不适合你。 你能告诉我你的“解析”代码是怎么样的吗? (例如,检索链接文档)。

作为一个例子,这是我为这个问题编写的测试用例,它似乎在MongoDB 2.4.6和PHP Driver 1.4.3本地工作正常

<?php

$mc = new MongoClient;
$companies = $mc->selectCollection("nc_main", "companies");
$users = $mc->selectCollection("nc_test", "users");

/*
$companies->drop();
$users->drop();
*/



/* Create a user in nc_test.users */
$user = array(
    "nick"  => "bjori",
    "title" => "Fixer",
);
$users->insert($user);

/* Create a reference to the newly created user */
$userref = MongoDBRef::create("users", $user["_id"], "nc_test");


/* Create a company in nc_main.copmanies */
$company = array(
    "name" => "MongoDB",
    "maintainer" => $userref,
);
$companies->insert($company);


/* Fetch the inserted company again, just to make sure the roundtrip didn't
 * modify the MongoDBRef in any way */
$mongodb = $companies->findOne(array("_id" => $company["_id"]));
/* Get the reference.. */
$maintainer = $mongodb["maintainer"];

/* Backtrac the database to select from by passing it as the first argument */
$bjori = MongoDBRef::get($mc->selectDb($maintainer['$db']), $maintainer);
var_dump($bjori);
?>

结果:

array(3) {
  ["_id"]=>
  object(MongoId)#14 (1) {
    ["$id"]=>
    string(24) "528ab8c68c89fef7250041a7"
  }
  ["nick"]=>
  string(5) "bjori"
  ["title"]=>
  string(5) "Fixer"
}