Выполняет левое внешнее соединение в незащищенном наборе в той же базе данных для фильтрации в документах из «объединенной» коллекции для обработки. Для каждого входного документа этап $ lookup добавляет новое поле массива, элементы которого являются соответствующими документами из «объединенной» коллекции. Эта стадия $ lookup передает эти измененные документы на следующий этап. Этап $ lookup имеет следующие синтаксисы:
Чтобы выполнить совпадение равенства между полем из входных документов с полем из документов «объединенной» коллекции, этап $ lookup имеет следующий синтаксис:
{
$lookup:
{
from: ,
localField: ,
foreignField: ,
as:
Операция будет соответствовать следующему выражению псевдо-SQL:
SELECT *,
Сегодня и snprintf
, и vsnprintf
должны быть доступны везде, кроме Windows с MSVC12 и старше. Самый простой способ для вас - предоставить snprintf
/ vsnprintf
в Windows, где он недоступен.
Windows предоставляет функцию _vsnprintf_s
, которая уже аналогична vsnprintf
, но имеет следующие важные различия в отношении того, что происходит, когда буфер слишком мал:
count
Аргумент, которого нет в vsnprintf
. Чтобы получить vsnprintf
поведение, вы можете передать _TRUNCATE
здесь. -1
возвращается вместо необходимого количества символов. Это можно исправить с помощью функции _vscprintf
, которую нужно вызывать только в случае сбоя предыдущего вызова _vsnprintf_s
. Кроме того, эти функции не поддерживают спецификаторы формата, добавленные в C99, такие как %zd
. Это не может быть легко решено, вам придется избегать их использования.
Код ниже:
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
int r = -1;
if (size != 0)
{
va_list args_copy;
va_copy(args_copy, args);
r = _vsnprintf_s(buf, size, _TRUNCATE, fmt, args_copy);
va_end(args_copy);
}
if (r == -1)
{
r = _vscprintf(fmt, args);
}
return r;
}
int snprintf(char *buf, size_t size, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
int r = vsnprintf(buf, size, fmt, args);
va_end(args);
return r;
}
Примечание: Windows также предоставляет _vsnprintf
, который выглядит лучше подходящим для этой реализации, но не завершает результирующую строку. Если вы хотите использовать его, вы должны быть осторожны.