Запрос информации о вложенных Mongodb с именами переменных вложенных полей - PullRequest
0 голосов
/ 31 мая 2018

У меня есть MongoDB, который структурирован, как показано ниже:

[
    {
        "subject_id": "1",
        "name": "Maria",
        "dob": "1/1/00",
        "gender": "F",
        "visits": {
            "1/1/18": {
                "date_entered": "1/2/18",
                "entered_by": "Sally"
            },
            "1/2/18": {
                "date_entered": "1/2/18",
                "entered_by": "Tim",
            }
        },
        "samples": {
            "XXX123": {
                "collected_by": "Sally",
                "collection_date": "1/3/18"
            }
        }
    },
    {
        "subject_id": "2",
        "name": "Bob",
        "dob": "1/2/00",
        "gender": "M",
        "visits": {
            "1/3/18": {
                "date_entered": "1/4/18",
                "entered_by": "Tim"
            }
        },
        "samples": {
            "YYY456": {
                "collected_by": "Sally",
                "collection_date": "1/5/18"
            },
            "ZZZ789": {
                "collected_by": "Tim",
                "collection_date": "1/6/18"
            },
            "AAA123": {
                "collected_by": "Sally",
                "collection_date": "1/7/18"
            }
        }
    }
]

Если бы я хотел запросить базу данных, чтобы найти все образцы, собранные Салли, или все посещения, введенные Тимом, каков был бы лучший способделая это?

Я новичок в MongoDB, и мои попытки с различными регулярными выражениями не дали результатов.Любой совет будет принят с благодарностью.

1 Ответ

0 голосов
/ 31 мая 2018

Сначала я использовал project в обязательных полях, чтобы использовать objectToArray, а затем unwind для создания отдельных записей для массива, созданного в project.

Затем результаты фильтруются с использованием match.

Это работает для данных, представленных в вопросе -

db.so.aggregate([
    {$project: {visits: {$objectToArray: "$visits"}, samples: {$objectToArray: "$samples"}}},
    {$unwind: "$visits"},
    {$unwind: "$samples"},
    { $match: { 
            $or : [
                { "visits.v.entered_by" : "Tim" },
                { "samples.v.collected_by" : "Sally" }
            ]
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...