Оператор $ push добавляет указанное значение в массив.
{ $push: {
: , ... } } $ push добавляет поле массива со значением как своим элементом.
Выше ответ отвечает всем требованиям, но я получил его работу, выполнив следующие
var objFriends = { fname:"fname",lname:"lname",surname:"surname" }; Friend.findOneAndUpdate( { _id: req.body.id }, { $push: { friends: objFriends } }, function (error, success) { if (error) { console.log(error); } else { console.log(success); } }); )
Вы наблюдаете поведение, потому что, если символ новой строки не записывается в ID из-за отсутствия места, он остается во входном буфере, который последующие два вызова scanf()
не используют из-за того, что строка спецификатора формата не читается белым пространство.
fgets()
возвращается при вводе новой строки, и новая строка записывается в буфер. В этом случае вам необходим буфер из 12 символов - для размещения новой строки и нулевого терминатора. Хорошей идеей является также инициализация буфера нулями.
char ID[11] = {0} ;
После fgets()
вам может потребоваться заменить символ новой строки на ноль.
Чтобы заменить новую строку на nul или отбросить данные входного буфера, где новая строка остается:
char* end = strrchr( ID, `\n` ) ;
if( end != NULL)
{
*end = `\0`
}
else
{
char c ;
do
{
c = getchar() ;
} while( c != '\n' && c != EOF ) ;
}
Причина в том, что остальная часть строки не извлекается fgets()
, если она больше переданного буфера и, следовательно, остается во входном буфере вашего файлового потока stdin; впоследствии преобразования scanf()
не удаются.
Вам придется обнаружить этот случай (например, проверив, является ли последний символ в вашей только что прочитанной строке не новой строкой) и очистить входной буфер до следующей новой строки, например, вызвав getchar()
в цикл до новой строки (или EOF). Затем позвоните scanf()
.
Пример кода (непроверенный и EOF-проверка по-прежнему отсутствует):
fgets(ID, sizeof(ID), stdin);
if (ID[strlen(ID)-1] != '\n') {
while (getchar() != '\n')
;
}
И не забудьте проверить возвращаемые значения ваших вызовов scanf()
, чтобы увидеть, если преобразования были успешными!