Самое простое решение - просто указать team_id в схеме платежей (которая у вас уже есть).
Вам не нужны ни user_id, ни payment_id в схеме команды, чтобы получать платежи с командой. Вы можете просто получить сводный запрос с поиском в таблице платежей, чтобы получить команду вместе с оплатой.
Итак, учитывая, что у вас есть ID команд и вам нужны данные о командах вместе с данными о платежах, вы можете написать запрос агрегирования, что-то вроде этого,
Team.aggregate([
{
$match: { _id: { $in: list_of_user_ids } } // this will get the teams which match the array of ids
},
{
$lookup: // this will search data from a different collection
{
from: 'payments', // the collection to search from
localField: '_id', // the matching field in the team collection
foreignField: 'team', // matching field in the payment colection
as: 'payment' the name you want to give to the resulting payment object
}
}
])
Редактировать 1: Поиск, который я написал, делает именно то, что вам нужно. Просто я предположил, что у вас есть массив идентификаторов пользователей. Если у вас один идентификатор пользователя, просто измените операцию сопоставления на написанную вами
$match: { user_id: currently_loggedin_userId }
[Позднее редактировать] 8. Покупайте более быстрые машины.
Это моя любимая мозоль, поэтому, даже если вы уже приняли превосходный ответ, я добавлю:
В C ++ это не столько язык как таковой, но модель сборки, предписанная языком, которая был великолепен еще в семидесятых, и библиотеки с тяжелыми заголовками.
Единственное, что не так в ответе Кэтэлина Питиха: «покупай быстрее машины» должно идти первым. Это самый простой способ с наименьшим воздействием.
Мое худшее было около 80 минут на устаревшей сборочной машине с VC6 на W2K Professional. Тот же самый проект (с тоннами нового кода) теперь занимает менее 6 минут на машине с 4-мя гиперпоточными ядрами, 8G RAM Win 7 x64 и приличными дисками. (Аналогичная машина, процессорная мощность которой примерно на 10,20% меньше, с 4G RAM и Vista x86 занимает вдвое больше времени)
Как ни странно, инкрементные сборки в большинстве случаев медленнее, чем полные перестройки.
В целом, большие проекты на C ++, над которыми я работал, имели медленное время сборки, были довольно грязными, с множеством взаимозависимостей, разбросанных по коду (те же самые файлы, используемые в большинстве cpps, толстые интерфейсы вместо тонких). В этих случаях медленное время сборки было лишь симптомом более серьезной проблемы, и при этом второстепенным симптомом. Рефакторинг для создания более понятных интерфейсов и разбивки кода на библиотеки улучшил архитектуру и время сборки. Когда вы создаете библиотеку, это заставляет вас думать о том, что является интерфейсом, а что нет, что на самом деле (по моему опыту) в конечном итоге улучшит базу кода. Если нет технической причины для разделения кода, некоторые программисты в ходе обслуживания просто выбросят что-нибудь в любой заголовочный файл.
ccache & amp; distcc (для проектов C / C ++) -
ccache кэширует скомпилированный вывод, используя предварительно обработанный файл в качестве «ключа» для поиска выходных данных. Это замечательно, потому что предварительная обработка довольно быстрая, и довольно часто изменения, которые вынуждают перекомпилировать, на самом деле не меняют источник для многих файлов. Кроме того, это действительно ускоряет полную перекомпиляцию. Также хорош тот случай, когда вы можете иметь общий кеш между членами команды. Это означает, что только первый парень, который получил последний код, на самом деле что-то компилирует.
distcc выполняет распределенную компиляцию по сети машин. Это хорошо, только если у вас есть сеть машин для компиляции. Он хорошо работает с ccache и перемещает только предварительно обработанный исходный код, поэтому единственное, о чем вам следует беспокоиться в системах с движком компилятора, это то, что у них есть правильный компилятор (нет необходимости видеть заголовки или все дерево исходных кодов, чтобы быть видимыми ).
Мощные машины компиляции и параллельные компиляторы. Мы также стараемся, чтобы полная сборка была как можно реже. Мы не меняем код, чтобы он компилировался быстрее.
Эффективность и правильность важнее скорости компиляции.
Лучшее предложение - создать make-файлы, которые действительно понимают зависимости и не перестраивают автоматически мир для небольшого изменения. Но если полная перестройка занимает 90 минут, а небольшая перестройка занимает 5-10 минут, велика вероятность, что ваша система сборки уже делает это.
Можно ли строить параллельно? Либо с несколькими ядрами, либо с несколькими серверами?
Проверяйте предварительно скомпилированные биты для частей, которые действительно статичны и не нужно каждый раз перестраивать. Сторонние инструменты / библиотеки, которые используются, но не изменяются, являются хорошим кандидатом для этого лечения.
Ограничьте сборку одним «потоком», если применимо. «Полный продукт» может включать такие вещи, как отладочная версия или как 32-, так и 64-разрядные версии, или может включать файлы справки или страницы руководства, которые создаются / создаются каждый раз. Удаление компонентов, которые не нужны для разработки, может значительно сократить время сборки.
Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?
Наконец, вы можете изменить кодовую базу, сделав ее более модульной и имеющей меньше зависимостей. Крупномасштабная разработка программного обеспечения C ++ - отличный справочник для обучения разделению крупных программных продуктов на то, что легче поддерживать и быстрее строить.
РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.
Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?
Наконец, вы можете изменить кодовую базу, сделав ее более модульной и имеющей меньше зависимостей. Крупномасштабная разработка программного обеспечения C ++ - отличный справочник для обучения разделению крупных программных продуктов на то, что легче поддерживать и быстрее строить.
РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.
Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?
Наконец, вы можете изменить кодовую базу, сделав ее более модульной и имеющей меньше зависимостей. Крупномасштабная разработка программного обеспечения C ++ - отличный справочник для обучения разделению крупных программных продуктов на то, что легче поддерживать и быстрее строить.
РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.
Крупномасштабная разработка программного обеспечения C ++ - отличный справочник для обучения разделению крупных программных продуктов на то, что легче поддерживать и быстрее строить.РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.
Крупномасштабная разработка программного обеспечения C ++ - отличный справочник для обучения разделению крупных программных продуктов на то, что легче поддерживать и быстрее строить.РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.
Сборки Unity
Incredibuild
Указатель на реализацию
форвардные объявления
, компилирующие "завершенные" разделы проекта в библиотеки DLL
Моя стратегия довольно проста - я не делаю больших проектов. Вся направленность современных вычислений - от гигантских и монолитных к маленьким и компонентным. Поэтому, когда я работаю над проектами, я разбиваю их на библиотеки и другие компоненты, которые можно создавать и тестировать независимо и которые имеют минимальную зависимость друг от друга. «Полная сборка» в такой среде никогда не происходит, так что проблем нет.
В этой книге Крупномасштабное проектирование программного обеспечения C ++ есть очень полезные советы, которые я использовал в прошлых проектах.
Это список того, что мы сделали для разработки под Linux:
Мы однажды пытались создать прокси-классы.
На самом деле это упрощенная версия класса, который включает только открытый интерфейс, уменьшая количество внутренних зависимостей, которые должны быть представлены в файле заголовка. Однако за них пришлось дорого распределять каждый класс по нескольким файлам, которые требовалось обновлять при внесении изменений в интерфейс класса.
Последние два позволили нам сократить время связывания с 12 минут до 1-2 минут. Обратите внимание, что это необходимо только в том случае, если объекты хорошо видны, т. Е. Видны «повсюду» и если существует много различных констант и классов.
Ура
Полная сборка около 2 часов. Я стараюсь избегать внесения изменений в базовые классы, и поскольку моя работа в основном связана с реализацией этих базовых классов, мне нужно создавать только небольшие компоненты (пара минут).
В Visual Studio вы можете указать количество проектов для компиляции за раз. Его значение по умолчанию - 2, при увеличении которого время сокращается.
Это поможет, если вы не хотите связываться с кодом.
Одна уловка, которая иногда помогает, - это включить все в один файл .cpp. Поскольку включения обрабатываются один раз для каждого файла, это может сэкономить вам много времени. (Обратной стороной этого является то, что компилятор не может распараллеливать компиляцию)
Вы должны иметь возможность указать, что несколько файлов .cpp должны компилироваться параллельно (-j с make в Linux, / MP в MSVC - MSVC также имеет возможность компилировать несколько проектов параллельно. Это отдельные параметры, и нет причин, по которым вы не должны использовать оба)
В том же духе распределенные сборки (например, Incredibuild) могут помочь загрузка одной системы.
SSD-диски должны быть большим выигрышем, хотя я сам этого не тестировал (но сборка C ++ затрагивает огромное количество файлов, что может быстро стать узким местом).
Предварительно скомпилированные заголовки тоже могут помочь при осторожном использовании. (Они также могут навредить вам, если их придется перекомпилировать слишком часто.)
И, наконец, важна попытка минимизировать зависимости в самом коде. Используйте идиому pImpl, используйте форвардные объявления, сохраняйте код как можно более модульным. В некоторых случаях использование шаблонов может помочь вам разделить классы и минимизировать зависимости. (В других случаях шаблоны, конечно, могут значительно замедлить компиляцию)
Но да, вы правы, это во многом вопрос языка. Я не знаю другого языка, который так сильно страдает от этой проблемы. Большинство языков имеют модульную систему, которая позволяет им исключать файлы заголовков, что имеет огромное значение. C имеет файлы заголовков, но это настолько простой язык, что время компиляции все еще управляемо. C ++ получает худшее из обоих миров.
Кэтэлин Питиш рассказал много хорошего. Другие, которые мы делаем:
Создайте несколько проектов модульных тестов для тестирования отдельных библиотек, чтобы, если вам нужно отредактировать низкоуровневые классы, которые вызовут огромную перестройку, вы можете использовать TDD, чтобы знать, что ваш новый код работает, прежде чем перестраивать все приложение. В книге Джона Лакоса, упомянутой Фемидой, есть несколько очень практических советов по реструктуризации ваших библиотек, чтобы это стало возможным.