Это было отмечено как повторяющееся. Однако ответ, помеченный как повторяющийся, я уже рассматривал, и он мне не помог. Пожалуйста, продолжайте читать.
В MongoDB я пытаюсь вернуть отфильтрованные результаты из вложенного набора данных. Я пробовал решения, которые ранее отвечали на вопросы здесь, но пока ни одно из них не помогло мне.
Вот пример моих данных, содержащих один объект (со вторым вложенным объектом «recipe») в массиве «cohol ». Фактические данные содержат несколько объектов в массиве «cohol », все с одинаковыми полями, но разными значениями. Я не включил все это сюда, чтобы сэкономить место.
`{
"_id": {
"$oid": "5bc53e0ce7179a4377fb226e"
},
"category": {
"alcohol": [
{
"cat_name": "beer",
"recipe_name": "summer lager",
"style": "lager",
"level": "intermediate",
"flavour": "sweet",
"region": "n.american",
"method": "top-fermented",
"properties": "ABV 4%",
"free-from": [
"gluten-free"
],
"recipe": {
"recipe_name": "summer lager",
"description": "sparkling, light & fresh",
"equip_list": [
"scissors",
"saucepan",
"strainer"
],
"ingredients_list": [
"10 cups water",
"300g southern dry hops",
"25g beer yeast"
],
"prep_method": [
"pour the water into an airtight container",
"add the yeast",
"roast the hops gently",
"remove from the heat",
"leave to steep for 30 minutes",
"close the airlock, and keep checking"
],
"added_by": "allie smyth",
"date_added": "02/10/17",
"upvotes": "25",
"url": "/"
}
}
]
}
}`
Представив, что в массиве «алкоголь» более одного объекта, допустим, я хочу получить только указанный выше объект. Читая документы, я подумал, что синтаксис будет следующим:
db.find({"category.alcohol": {"$elemMatch": {"recipe_name":"summer lager"}}})
Однако это продолжает возвращать всю коллекцию. Я также пробовал использовать модификатор $ in следующим образом, но он ничего не возвращает:
db.find({"category.alcohol": {"$in": ["summer lager", "intermediate"]}})
Ближе всего к ограничению результатов запроса я смог использовать оператор проекции для возврата первого найденного объекта, содержащего заданное значение.
db.find({"category.alcohol.recipe_name":"summer lager"}, {"_id":0, "category.alcohol.$":1})
Однако для меня это не очень полезно, потому что я хочу иметь возможность возвращать все объекты, соответствующие параметрам запроса.
Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация. Это мой первый пост на этом форуме. Спасибо :)
Спасибо, @DanielRoseman, я подумал, что могу запросить в одном документе, состоящем из вложенных документов описанным способом. Теперь я создал отдельные документы из вложенных элементов выше, и запросы работают нормально.
Вы пробовали использовать оператор $ filter, указанный в дубликате?






Но это не коллекция, это отдельный предмет. Если вам нужно иметь возможность возвращать элементы по отдельности, вы должны моделировать их как отдельные элементы.