MongoDB найти массив $ type не работает [дубликат]

Он делает это, потому что input.nextInt(); не фиксирует новую строку. вы могли бы сделать, как и другие, добавив под ним input.nextLine();. В качестве альтернативы вы можете сделать это в стиле C # и разобрать nextLine на целое число так:

int number = Integer.parseInt(input.nextLine()); 

Выполнение этого работает так же хорошо, и оно сохраняет строку кода.

6
задан Blakes Seven 10 September 2015 в 23:07
поделиться

2 ответа

На самом деле в документации для $type есть «gotcha», в частности, о массивах:

При применении к массивам тип $ соответствует любому внутреннему элементу то есть указанного типа. Без проекции это означает, что весь массив будет соответствовать, если какой-либо элемент имеет правильный тип. С проекцией результаты будут включать только те элементы запрашиваемого типа.

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

Теперь сама документация предлагает этот тест JavaScript с помощью $where :

.find({ "$where": "return Array.isArray(this.author)" })

Но я думаю, что это довольно ужасно, поскольку есть лучший способ.

Трюк находится в «точечной нотации» , где вы запрашиваете индексный элемент 0 массива к $exists

.find({ "author.0": { "$exists": true } })

Это всего лишь основной случай, если элемент «0» существует, тогда поле присутствует, и поэтому данные являются массивом.

Как только вы понимаете эту логическую предпосылку, это довольно простой тест. Единственное, что не может сравниться с этим, это «действительно пустой» массив, и в этом случае вы можете вернуться к альтернативе JavaScript, если это необходимо. Но это может фактически использовать индекс, поэтому было бы предпочтительно использовать последнюю форму.

19
ответ дан Blakes Seven 26 August 2018 в 06:11
поделиться

Вот лучший способ сделать то, что вы изначально задали; то есть проверять, действительно ли определенное поле хранит значение типа массива:

.find({ "author": { "$gte": [] } })

Функциональность типа $ MongoDB для массивов, хотя и хорошо документирована, является ИМО несовместимой со всеми другими проверками типа $ и, очевидно, 't работать для этого варианта использования, но начиная примерно с 2.6 вы можете использовать указанный выше запрос, чтобы проверить, является ли это значение массивом (пустое или нет).

Я говорю, что это «лучше», чем в настоящее время выбранный ответ, потому что выполнение кода через $, где не рекомендуется, если стандартные конструкторы запроса действительно не могут выполнить задание.

Чтобы разработать, $ где не рекомендуется из-за производительности из-за отсутствия возможности использовать индексы в выполненный код. Подробнее: https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

Кроме того, если вы хотите проверить, не -пустые массивы, используйте это:

.find({ "author": { "$gt": [] } })

Технически это тоже лучше, чем соответствующее решение $ exists, соответствующее текущему ответу, так как поле может иметь объект без массива с полем с именем «0 », и это будет соответствовать« непустому массиву », что в этом случае неверно.

3
ответ дан Ciabaros 26 August 2018 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: