MongoDB仅使用PHP中没有reduce的map

时间:2015-07-12 17:43:59

标签: php mongodb join mapreduce

在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)
    );

0 个答案:

没有答案