Объекты запроса во вложенном массиве MongoDB

Это было отмечено как повторяющееся. Однако ответ, помеченный как повторяющийся, я уже рассматривал, и он мне не помог. Пожалуйста, продолжайте читать.

В 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})

Однако для меня это не очень полезно, потому что я хочу иметь возможность возвращать все объекты, соответствующие параметрам запроса.

Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация. Это мой первый пост на этом форуме. Спасибо :)

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

Daniel Roseman 20.10.2018 22:24

Спасибо, @DanielRoseman, я подумал, что могу запросить в одном документе, состоящем из вложенных документов описанным способом. Теперь я создал отдельные документы из вложенных элементов выше, и запросы работают нормально.

Nyanca 20.10.2018 23:46

Вы пробовали использовать оператор $ filter, указанный в дубликате?

s7vr 21.10.2018 01:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
18
0

Другие вопросы по теме