MongoDB - запрашивать вложенные объекты во вложенном массиве - PullRequest
0 голосов
/ 27 февраля 2019

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

db.getCollection('EventDateValidation').find({}):

/* 1 */
{
    "_id" : ObjectId("5b7b2e3ae5e2100007717d81"),
    "_class" : "com.overwatch.common.model.EventDateValidation",
    "caseNo" : "OW000002269122201810201135",
    "loanNo" : "000002269122",
    "eventType" : "BREACLETTR",
    "validationStepData" : [ 
        {
            "startDate" : {
                "isChecked" : "Y",               
                "comments" : "",
                "auditedBy" : "Mahalakshmi M",
                "auditedDate" : "2018-12-12"
            }
        }, 
        {
            "completedDate" : {
                "isChecked" : "Y",
                "comments" : "",
                "auditedBy" : "Mahalakshmi M",
                "auditedDate" : "2018-12-13"
            }
        }, 
        {
            "deadlineDate" : {
                "isChecked" : "Y",
                "comments" : "",
                "auditedBy" : "Mahalakshmi M",
                "auditedDate" : "2018-12-13"
            }
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5b7c11095c2b4d0007bc8c54"),
    "_class" : "com.overwatch.common.model.EventDateValidation",
    "caseNo" : "OW000000854076201808181158",
    "loanNo" : "000000854076",
    "eventType" : "FORSALAPPR",
    "validationStepData" : [ 
        {
            "startDate" : {
                "comments" : ""
            }
        }, 
        {
            "completedDate" : {
                "comments" : "Received Date = 8/4/2017"
            }
        }, 
        {
            "deadlineDate" : {
                "comments" : ""
            }
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5b7ad05d5c2b4d0007bc8631"),
    "_class" : "com.overwatch.common.model.EventDateValidation",
    "caseNo" : "OW000000873954201810201235",
    "loanNo" : "000000873954",
    "eventType" : "HUDNOTIFCA",
    "validationStepData" : [ 
        {
            "startDate" : {
                "isChecked" : "Y",
                "comments" : "",
                "auditedBy" : "Brett Scott",
                "auditedDate" : "2018-09-25"
            }
        }, 
        {
            "completedDate" : {
                "isChecked" : "Y",
                "comments" : "",
                "auditedBy" : "Brett Scott",
                "auditedDate" : "2018-09-25"
            }
        }, 
        {
            "deadlineDate" : {
                "isChecked" : "Y",
                "comments" : "",
                "auditedBy" : "Brett Scott",
                "auditedDate" : "2018-09-25"
            }
        }
    ]
}

Из этой коллекции мне нужно найти документы с «auditedDate» в «deadlineDate».В этом примере я найду документы 1 и 3. Пожалуйста, помогите мне, потому что я застрял на этом.

Я пытался

db.getCollection('EventDateValidation').find({"validationStepData.deadlineDate.auditedDate":{$exists:true}})

Но, похоже, не работает,Помогите пожалуйста!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Просто для прояснения ситуации: запрос в вопросе работает хорошо.Я поболтал с @Gabriel, и проблема заключалась в том, что Robomongo добавил в запрос скрытые непечатаемые символы Юникода.

В целом, для всех заинтересованных кочевников, есть несколько способов запросить массив объектов:

1) Неявная запись $ elemMatch / простая точка в массиве:

db.getCollection('EventDateValidation').find({"validationStepData.deadlineDate.auditedDate": {$exists:true}})

2) Явная запись $ elemMatch (у нас может быть несколько критериев запроса):

db.getCollection('EventDateValidation').find({"validationStepData": { $elemMatch: {"deadlineDate.auditedDate" : {$exists:true} }}})

3) Обозначение массива точек с позицией индекса (когда мы знаем точное положение элемента внутри массива):

db.getCollection('EventDateValidation').find({"validationStepData.2.deadlineDate.auditedDate": {$exists:true}})
0 голосов
/ 27 февраля 2019

Точечная запись не будет работать, так как у вас есть массив объектов в validationStepData.Вы можете использовать $ elemMatch , чтобы применить условия запроса к элементам массива, которые соответствуют вашему выражению.

db.getCollection('EventDateValidation').find({"validationStepData" : { $elemMatch: {"deadlineDate.auditedDate" : {$exists:true} }}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...