在mongoDB中,我有两个收集用户和帖子遵循以下结构:
帖子
{
_id: ObjectId(""),
subject: "some post",
content: "here is the content",
user_id: "4351"
}
用户
{
user_id: "4351",
name: "John Marks",
picURL: "http://...",
aboutme: "historian of the future"
}
需要使用名称来获取数组中的帖子。
db.posts.find().map(function(newPost){
newPost.name = db.users.findOne({user_id: newPost.user_id}).name;
return (newPost);
})
我编写了这段代码,它在mongoshell中的工作很好地返回了这个结果:
{
_id: ObjectId(""),
subject: "some post",
content: "here is the content",
user_id: "4351",
name: "John Marks"
}
但我无法在php中申请。你不能简单地获得map函数的输出。它需要减少函数和输出集合以返回值。
编辑:
$map = new MongoCode('
function(newPost) {
newPost.username = db.users.findOne({user_id: newPost.user_id}).name;
return newPost;
}
');
post = $app->mongo->command(array(
"mapreduce" => "posts",
"map" => $map,
"reduce" => '',
"out" => array("inline" => 1)
));
var_dump($post);
此代码必须正常工作,但在mongo 2.4发布后禁止通过'db'访问map功能中的另一个集合。这就是我改变方法的原因。而不是使用map / reduce,用php处理。将post_ user_ids添加到数组,并使用以下代码获取用户信息。
$userInf = $app->mongo->selectCollection("users")->find(
array('user_id' => array('$in' => $user_ids)),
array("_id" => 0, "user_id" => 1, "name" => 1, "picURL" => 1)
);