Он делает это, потому что input.nextInt();
не фиксирует новую строку. вы могли бы сделать, как и другие, добавив под ним input.nextLine();
. В качестве альтернативы вы можете сделать это в стиле C # и разобрать nextLine на целое число так:
int number = Integer.parseInt(input.nextLine());
Выполнение этого работает так же хорошо, и оно сохраняет строку кода.
На самом деле в документации для $type
есть «gotcha», в частности, о массивах:
При применении к массивам тип $ соответствует любому внутреннему элементу то есть указанного типа. Без проекции это означает, что весь массив будет соответствовать, если какой-либо элемент имеет правильный тип. С проекцией результаты будут включать только те элементы запрашиваемого типа.
blockquote>Таким образом, это означает, что вместо того, чтобы определять, находится ли сам элемент в массиве, то, что на самом деле тестируется, является «внутренний элемент» массива, чтобы увидеть, какой он тип.
Теперь сама документация предлагает этот тест JavaScript с помощью
$where
:.find({ "$where": "return Array.isArray(this.author)" })
Но я думаю, что это довольно ужасно, поскольку есть лучший способ.
Трюк находится в «точечной нотации» , где вы запрашиваете индексный элемент
0
массива к$exists
.find({ "author.0": { "$exists": true } })
Это всего лишь основной случай, если элемент «0» существует, тогда поле присутствует, и поэтому данные являются массивом.
Как только вы понимаете эту логическую предпосылку, это довольно простой тест. Единственное, что не может сравниться с этим, это «действительно пустой» массив, и в этом случае вы можете вернуться к альтернативе JavaScript, если это необходимо. Но это может фактически использовать индекс, поэтому было бы предпочтительно использовать последнюю форму.
Вот лучший способ сделать то, что вы изначально задали; то есть проверять, действительно ли определенное поле хранит значение типа массива:
.find({ "author": { "$gte": [] } })
Функциональность типа $ MongoDB для массивов, хотя и хорошо документирована, является ИМО несовместимой со всеми другими проверками типа $ и, очевидно, 't работать для этого варианта использования, но начиная примерно с 2.6 вы можете использовать указанный выше запрос, чтобы проверить, является ли это значение массивом (пустое или нет).
Я говорю, что это «лучше», чем в настоящее время выбранный ответ, потому что выполнение кода через $, где не рекомендуется, если стандартные конструкторы запроса действительно не могут выполнить задание.
Чтобы разработать, $ где не рекомендуется из-за производительности из-за отсутствия возможности использовать индексы в выполненный код. Подробнее: https://docs.mongodb.com/manual/reference/operator/query/where/#considerations
Кроме того, если вы хотите проверить, не -пустые массивы, используйте это:
.find({ "author": { "$gt": [] } })
Технически это тоже лучше, чем соответствующее решение $ exists, соответствующее текущему ответу, так как поле может иметь объект без массива с полем с именем «0 », и это будет соответствовать« непустому массиву », что в этом случае неверно.