Запрос массива встроенных документов в MongoDB на основе диапазона - PullRequest
2 голосов
/ 14 мая 2019

Как я могу запросить массив встроенного документа в mongodb.

{
 _id: 1,
 zipcode: "63109",
 students: [
              { name: "john", school: 102, age: 14 },
              { name: "jess", school: 102, age: 11 },
              { name: "jeff", school: 108, age: 15 }
           ]
}
{
 _id: 2,
 zipcode: "63110",
 students: [
              { name: "ajax", school: 100, age: 7 },
              { name: "achilles", school: 100, age: 8 },
           ]
}
{
 _id: 3,
 zipcode: "63109"
}

Допустим, для приведенных выше данных, как будут извлекаться только те строки, где age> = 7 и age <= 10.Для id_1 должна быть возвращена только строка с возрастом 10 лет.Обе строки в id_2 и id_3.Кроме того, id_4 не имеет поля с именем студентов.Итак, я НЕ хочу видеть это в выводе.</p>

Редактировать: - Вывод, который я получаю, выглядит примерно так, когда я делаю фильтр.Но я НЕ хочу строки, в которой есть "None".В последнем документе _id: 3 отсутствуют учащиеся на местах, но для учащихся выполняется фильтрация, поэтому для выходных данных указано «Нет».

Я хочу обработать 2 случая:

  1. Фильтрация не должна применяться, если массив «ученики» не существует под идентификатором.
  2. Массив учеников существуетно пусто []

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


{'_id': ObjectId('5cdaefd393436906b016ddb4'),
 'students': [{'name': ajax,
               'school': '100',
               'age': '7'},
              {'name': achilles,
               'school': '100',
               'age': '8'}],
{'_id': ObjectId('5cdaefd393436906b016ddb3'), 'students': None}

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

Редактировать: Наконец-то я использовал раскрутку, чтобы добиться того, чего хотел.

1 Ответ

1 голос
/ 14 мая 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$students", []] } }, 1] }}},
  { "$addFields": {
    "students": {
      "$filter": {
        "input": { "$ifNull": ["$students", []] },
        "cond": {
          "$and": [
            { "$gte": ["$$this.age", 7] },
            { "$lte": ["$$this.age", 10] }
          ]
        }
      }
    }
  }}
])
...