elemMatch поиск по массиву поддокумента

Как выполнить поиск с помощью elemMatch по массиву SubDocument? У меня есть документ ReportCollection с такими элементами, как: -

/* 0 */
{
    "_id" : ObjectId("5507bfc435e9470c9aaaa2ac"),
    "owner" : ObjectId("5507bfc31e14d78e177ceebd"),
    "reports" : {
        "xReport" : [ 
            {
                "name" : "xReport",
                "parameters" : {
                    "x" : {
                        "dateTime" : "2015-03-11T18:30:00.000Z",
                        "unit" : 1,
                        "value" : 102
                    }
                },
                "createdBy" : ObjectId("5507bfc31e14d78e177ceebd"),
                "modifiedBy" : ObjectId("5507bfc31e14d78e177ceebd"),
                "_id" : ObjectId("5507bfc41e14d78e177ceebf")
            }
        ]
    }
}

Я получил reports.xReport [] ._ id в качестве параметра поиска.

Моя следующая попытка не удалась: -

  db.reports.find ({ {owner: ObjectId("5507afd3d54bae3513c185cb")}, 
    { 'reports.xReport': {$elemMatch: {_id: ObjectId("5507afd3d54bae3513c185cd") }}} } )

person Anand    schedule 17.03.2015    source источник


Ответы (1)


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

db.reports.find(
    {
        "owner": ObjectId("5507bfc31e14d78e177ceebd"),
        "reports.xReport._id": ObjectId("5507bfc41e14d78e177ceebf")
    },
    { "reports.xReport.$": 1 }
)

Таким образом, «запрос» выполняет работу по сопоставлению позиции массива, а «проекция» просто использует эту позицию в сопоставлении.

Также обратите внимание, что вам никогда не понадобится $elemMatch с одним полем для сопоставления. Только когда в условии требуется несколько полей, вам нужно использовать это для соответствия определенному «элементу».

По той же причине, это также должно быть вместо этого в операторе "запроса".

$elemMatch в его прогнозируемой форме не может быть используется с полями вложенного документа через точечную нотацию.

person Neil Lunn    schedule 17.03.2015
comment
Спасибо, Ниль, (На самом деле весь параметр в моем примере был частью запроса, но я сделал его слишком сложным, как вы правильно предположили, мне не нужен $ elemMatch. - person Anand; 17.03.2015
comment
@SutikshanDubey Я обычно считаю, что стоит упомянуть об этом там, где позволяет контекст, поскольку это распространенное заблуждение наряду с различными другими операторами (особенно $in, $nin и т. Д.), Что вам нужно использовать такой оператор при работе с массивом данных. Это не только для вашей выгоды, но и для сайта вопросов и ответов, для пользы всех, кто может наткнуться на тот же вопрос. Дружеское напоминание о необходимости принимать ответы, которые решают ваши вопросы. В вашей учетной записи заметно мало принятых ответов на ваши вопросы. - person Neil Lunn; 17.03.2015
comment
эй, я пометил, что он принят, не уверен, почему ТАК не пометил ответ как принятый. (может быть, я открыл эту страницу в двух окнах браузера ...). Я попробовал еще раз, надеюсь, он останется принятым. Спасибо, приятель (я также рассмотрел свой другой вопрос после первого комментария ур :)). - person Anand; 17.03.2015