У меня есть коллекция MongoDB с документами в следующем формате:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
В настоящее время я могу получить документы, которые соответствуют определенному размеру массива:
db.accommodations.find({ name : { $size : 2 }})
Это правильно возвращает документы с 2 элементами в name
массиве. Тем не менее, я не могу выполнить $gt
команду, чтобы вернуть все документы, где name
поле имеет размер массива больше 2:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
Как я могу выбрать все документы с name
массивом размером больше одного (желательно без необходимости изменять текущую структуру данных)?
mongodb
mongodb-query
emson
источник
источник
Ответы:
Обновить:
Для mongodb версий 2.2+ более эффективный способ сделать это описан @JohnnyHK в другом ответе .
1. Использование $ где
Но...
2. Создайте дополнительное поле
NamesArrayLength
, обновите его, указав длину массива имен, а затем используйте в запросах:Это будет лучшее решение и будет работать намного быстрее (вы можете создать индекс по нему).
источник
$where
, он очень гибкий.Есть более эффективный способ сделать это в MongoDB 2.2+, теперь вы можете использовать числовые индексы массивов в ключах объекта запроса.
Вы можете поддержать этот запрос с помощью индекса, который использует частичное выражение фильтра (требуется 3.2+):
источник
{'Name Field.1': {$exists: true}}
.name
содержится по крайней мере 1 элемент, но ОП искал больше, чем 1.Я считаю, что это самый быстрый запрос, который отвечает на ваш вопрос, потому что он не использует интерпретированное
$where
предложение:Это означает, что «все документы, кроме тех, у которых нет имени (не существующего или пустого массива) или только с одним именем».
Тестовое задание:
источник
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
, а также, потому что это жестко задано для «1» и не масштабируется до произвольной или параметрической минимальной длины массива).Вы также можете использовать агрегат:
// вы добавляете «size_of_name» к транзитному документу и используете его для фильтрации размера имени
источник
Попробуйте сделать что-то вроде этого:
1 - это число, если вы хотите получить запись больше 50, тогда сделайте ArrayName.50 Спасибо.
источник
Ничто из вышеперечисленного не помогло мне. Этот сделал так, я делюсь этим:
источник
Вы можете использовать $ expr (оператор версии 3.6 mongo), чтобы использовать функции агрегирования в обычном запросе.
Сравните
query operators
противaggregation comparison operators
.источник
$name
массива , который является поддокументом, например , в «лице» запись,passport.stamps
? Я пробовал разные комбинации цитирования, но получаю"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
источник
MongoDB 3.6 включает $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Вы можете использовать $ expr для оценки выражения внутри $ match или поиска.
или найти
источник
Я нашел это решение, чтобы найти элементы с массивом поле больше определенной длины
Первый агрегат $ match использует аргумент true для всех документов. Если пусто, я бы получил
источник
Я знаю его старый вопрос, но я пытаюсь это сделать с помощью $ gte и $ size в find. Я думаю, что найти () быстрее.
источник
Хотя вышеприведенные ответы все работают, то, что вы изначально пытались сделать, было правильным способом, однако у вас просто есть синтаксис в обратном направлении (переключите «$ size» и «$ gt») ..
Правильный:
Неправильно:
источник