0

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

/* 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 [] ._ идентификатор в качестве параметра поиска.

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

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

ответ

3

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

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

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

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

К тому же это должно быть также в операторе запроса.

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

+1

Спасибо, Ниль, (На самом деле весь параметр в моем примере был частью запроса, но я сделал это слишком сложным, как я вам по праву предложил, мне не понадобилось $ elemMatch. –

+0

@SutikshanDubey Я обычно чувствую, что это что-то стоит упомянуть, где контекст позволяет, поскольку это распространенное заблуждение наряду с различными другими операторами (в частности, '$ in',' $ nin' и т. д.), что вам нужно использовать такой оператор при работе с массивом в данных. Это не только для ваше преимущество, но на ресурсном сайте Q & A, в интересах всех, кто может наткнуться на один и тот же вопрос. Напоминающее напоминание, чтобы принять ответы, которые решают ваши вопросы. Ваша учетная запись, в частности, «свет» на принятых ответах на ваши вопросы. –

+0

эй , Я действительно отметил, что он принят, но не уверен, почему SO не отметил ответ в качестве принятого. (Возможно, эта страница открылась в двух окнах браузера ...). Я попробовал еще раз, я надеюсь, что это будет Я остаюсь принятым. Спасибо mate (я также рассмотрел мой другой вопрос после ур 1-го комментария :)). –

Смежные вопросы