Как запросить вложенные документы с именами переменных - PullRequest
0 голосов
/ 03 июля 2018

У меня есть документ json, который я импортировал в mongodb, который похож на тестовые данные ниже:

[
    {
        "subject_id": "1",
        "name": "Bob",
        "dob": "12/31/00",
        "gender": "Male",
        "visits": {
            "12/31/15": {
                "age": "17",
                "visit_category": "Baseline Visit"
            },
            "12/31/16": {
                "age": "18",
                "visit_category": "Follow Up Visit"
            },
            "12/31/17": {
                "age": "18",
                "visit_category": "Follow Up Visit"
            }
        },
        "samples": {
            "XXX123": {
                "completed_by": "Sally",
                "label_on_sample": "1"
            }
        }
    },
    {
        "subject_id": "2",
        "name": null,
        "dob": "1/1/01",
        "gender": "Female",
        "visits": {
            "1/1/11": {
                "age": "10",
                "visit_category": "Baseline Visit"
            },
            "1/1/12": {
                "age": "11",
                "visit_category": "Follow Up Visit"
            },
            "1/1/13": {
                "age": "12",
                "visit_category": "Follow Up Visit"
            },
            "1/1/14": {
                "age": "13",
                "visit_category": "Follow Up Visit"
            },
            "1/1/15": {
                "age": "14",
                "visit_category": "Follow Up Visit"
            }
        },
        "samples": {
            "YYY456": {
                "completed_by": null,
                "label_on_sample": "2"
            },
            "ZZZ789": {
                "completed_by": "Sally",
                "label_on_sample": "2"
            }
        }
    }
]

Я бы хотел запросить информацию в пределах дат посещения или образцов, но я думаю, что застрял из-за их переменных названий. Каков наилучший способ запроса всех вложенных документов.

filter_by = {'subject.samples': {'$elemMatch': {'visit_category': "Follow Up Visit" }}}
data = db['subject'].find(filter_by)
print(data.count())

Возвращает 0. Как бы я отформатировал какой-то подстановочный знак после 'subject.samples', чтобы заставить это работать.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2018

Во-первых, вы можете исправить структуру документа, чтобы ключ посещений содержал массив посещений .

Mongo позволяет выполнять конвейерный запрос , который преобразует объект в массив , но я не думаю, что это легко масштабируется для больших коллекций без учета других способов оптимизации поиска.

Вот как я буду запрашивать общее количество посещений, соответствующих "Последующему посещению"

pipeline =  [
      {
         '$project': {
            'visits': { '$objectToArray': '$visits' }
         }
      },
     {
         '$unwind': '$visits'
     },
     {
        '$match': {
            'visits.v.visit_category': 'Follow Up Visit'
        }
     },
     {
        '$count': 'count'
     }
]
cur = db.patient.aggregate(pipeline)
result = next(cur)

print(result['count'])
...