Монго - собрать стол из двух коллекций - PullRequest
0 голосов
/ 18 января 2012

Я пытаюсь воспроизвести то, что будет левым соединением в MySql в Монго. У меня есть коллекция с именем «Клиенты» и другая коллекция с именем «Заказы».

В коллекции клиентов есть:

client_PK, FirstName, LastName, Company

В коллекции заказов у ​​меня есть:

order_PK, client_fk, OrderDate, OrderAmount,  

Так что я знаю, что могу использовать встроенные документы, но ради этого вопроса я собираюсь использовать эталонную модель.

Мой вопрос: используя эти две коллекции, как мне построить таблицу или объект, похожий на левое соединение в mysql? Я знаю, что это документ БД не реляционный БД, но я использую язык SQL просто для того, чтобы дать вам представление о том, что я пытаюсь сделать. В MySql это будет выглядеть так:

SELECT * FROM orders LEFT JOIN clients ON clients.client_PK = orders.client_fk

теперь я могу построить таблицу, которая будет выглядеть так:

FirstName | LastName | Company | OrderDate | OrderAmount

тогда я мог бы повторить строки, используя цикл while для отображения всех заказов и отображения имени клиента вместе с заказом. Опять же, я знаю, что монго не является реляционной БД, но я предполагаю, что есть способ имитировать таблицу, используя две коллекции.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 января 2012

Вы почти наверняка захотите хранить эти данные в одной коллекции MongoCollection (даже в просто коллекции денормализации).

Если вы абсолютно не можете этого сделать, однако, и , если ваш набор маленький, вы можете сделать что-то похожее на это (поскольку вы спрашивали о PHP):

<?php
// gather orders
$orders = iterator_to_array($mongodb->orders->find());
$joinedOrders = array();
// gather clients
foreach ($db->clients->find() as $client) {
    // iterate orders (like a left join)
    foreach ($orders as $order) {
        // make a "joinedOrders" record for each join match
        if ($order['client_fk'] == $client['client_PK']) {
            $joinedOrders[] = array_merge($order, $client);
        }
    }
}
// result is now in $joinedOrders

Это, однако, почти всегда плохая идея. (-: Вы действительно должны денормализовать свои данные или использовать реляционную базу данных для хранения / запроса реляционных данных.

1 голос
/ 18 января 2012

Я предполагаю, что есть способ смоделировать таблицу, используя две коллекции

MongoDB не имеет никакого инструмента для этого. Вы в основном собираетесь иметь "катить свои собственные" соединения. На базовом уровне это означает, что вам придется писать вложенные циклы for и создавать результирующий набор в своем коде.

Выполнение этого типа "дополнительной логики" довольно распространено в MongoDB из-за отсутствия соединений. Если вы часто видите этот шаблон, вы можете рассмотреть возможность использования SQL для части ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...