MongoDB交叉数据库DBRef';s在2.4中

MongoDB交叉数据库DBRef';s在2.4中,mongodb,mongodb-php,Mongodb,Mongodb Php,我在本地运行MongoDB 2.4.6,测试时MongoDB PECL扩展是1.4.3 我目前正在开发一个应用程序,它有两个MongoDB数据库,一个名为nc_main,集合名为companys,另一个名为nc_test,集合名为users。我正在尝试设置它,以便公司文档可以引用用户文档,但它似乎不适合我。当我查看公司文档时,我看到: { "_id" : ObjectId("xxxx"), "maintainer" : DBRef("users", ObjectId("yyyy"

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

我目前正在开发一个应用程序,它有两个MongoDB数据库,一个名为
nc_main
,集合名为
companys
,另一个名为
nc_test
,集合名为
users
。我正在尝试设置它,以便
公司
文档可以引用
用户
文档,但它似乎不适合我。当我查看公司文档时,我看到:

{
    "_id" : ObjectId("xxxx"),
    "maintainer" : DBRef("users", ObjectId("yyyy"))
}
然而,DBRef是在PHP中使用以下命令设置的:
MongoDBRef::create('users',$user['id','nc_test')

我可以运行以下查询,但它不会改变我在查询文档时看到的内容:
db.companys.update({u id:ObjectId(“xxxx”)},{$set:{maintener:{“$ref:”users“,“$id”:ObjectId(“yyyy”),“$db:”nc_test“}}})


这导致的问题是,试图通过引用加载
用户
文档会导致文档未找到错误,因为它在
nc_main
数据库中查找,而不是像我试图告诉它的那样在
nc_测试中查找。

请注意,shell不支持MongoDBRef的$db fieldname,这就是为什么它没有出现在那里(仔细想想,它看起来像是shell中的一个bug,它甚至将数据转换为DBRef JavaScript对象)

此外,MongoDBRef是一个惯例。它并不神奇,也不做任何“自动抓取”或“自动扩展”,它只是一种惯例,许多人使用它来“链接”同一个集合中的文档,有时甚至跨数据库。但并非所有ODM(或相关驱动程序)都支持$db字段名

尽管如此,这是一个很好的会议——但我不太明白什么对你不起作用。 你能告诉我你的“解析”代码是什么样子的吗?(例如检索链接的文档)

作为一个例子,这是我为这个问题编写的测试用例,它在MongoDB 2.4.6和PHP驱动程序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);
?>

只有实际的PHP驱动程序维护人员才能回答这个问题,您最好去用户组
array(3) {
  ["_id"]=>
  object(MongoId)#14 (1) {
    ["$id"]=>
    string(24) "528ab8c68c89fef7250041a7"
  }
  ["nick"]=>
  string(5) "bjori"
  ["title"]=>
  string(5) "Fixer"
}