У меня есть коллекция с именем Запросы с документами, следующими за этим прототипом:
{
"_id": {
"$id": "56295368ef2b8e5458000029"},
"title": "Hardcoded Name",
"requestorId": "dve34gegrgeefdsfewe"}
requestorId
из этих документов коррелирует с id
(не _id
Монго ID объекта) пользователи Коллекция, документы которой следуют этому прототипу:
{
"_id": {
"$id": "86235288ef2gif5458000027"},
"id": "dve34gegrgeefdsfewe",
"name": "John Doe"}
Я должен быть в состоянии запустить find()
на Запросы Сбор и получение name
связано с requestorId
в каждом запросе документ. Я обычно просто делаю очевидное: запустить find()
на requests
затем, просматривая каждый документ, выполните последующий запрос пользователи где id = [requestorId (really "id" in users collection)]
НО мне нужно уметь сортировать весь Запросы Коллекция по имени, связанному с каждым requestorId
затем используйте skip()
& limit()
, Это должно быть довольно просто, но я не могу понять это … Вот мой код, вдохновленный https://www.noppanit.com/merge-documents-two-collections-together-mongodb/
$m = new MongoClient(); // connect
$db = $m->{"database"};
// construct map and reduce functions
$eventRequest_map = new MongoCode("function() {
emit(this.requestorId, {\"requestorId\" : this.requestorId})
}");
$user_map = new MongoCode("function() {
emit(this.id, {\"name\" : this.name})
}");
$reductionFunction = new MongoCode("function(key, values) {
var result = {
\"requestorId\" : \"\",
\"name\" : \"\"};
return result;
}");
$sales = $db->command(array(
'mapreduce' => "requests",
'map' => $eventRequest_map,
'reduce' => $reductionFunction,
'query' => array(),
'out' => 'joined'));
$sales = $db->command(array(
'mapreduce' => "users",
'map' => $user_map,
'reduce' => $reductionFunction,
'query' => array(),
'out' => 'joined'));
$collection = $db->joined;
$cursor = $collection->find();
$outputJoined = array();
foreach($cursor as $doc){
$outputJoined[] = $doc;
}
echo json_encode($outputJoined);
Задача ещё не решена.
Других решений пока нет …