Как применить "arrayFilters" к массиву верхнего уровня? - PullRequest
0 голосов
/ 18 сентября 2018

Мой вопрос похож на Удалить объект из вложенного массива по нескольким критериям .Основное отличие состоит в том, что я хочу сначала применить arrayFilter к массиву верхнего уровня, а затем применить еще один arrayFilter к вложенному массиву соответствующего элемента массива верхнего уровня.

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

{
    "OtherField1" : ISODate("2016-05-06T05:09:14.589Z"),
    "OtherField2" : "something",
    "Distributions" : [
            {
                    "DeliveryType" : 1,
                    "DeliverySubType" : 2,
                    "DistributionData" : [
                            {
                                    "Key" : "Topic",
                                    "Value" : "Topics",
                                    "Children" : null
                            },
                            {
                                    "Key" : "Message",
                                    "Value" : "test",
                                    "Children" : null
                            }
                    ]
            },
            {
                    "DeliveryType" : 1,
                    "DeliverySubType" : 3,
                    "DistributionData" : [
                            {
                                    "Key" : "Topic",
                                    "Value" : "Topics",
                                    "Children" : ""
                            },
                            {
                                    "Key" : "Message",
                                    "Value" : "test",
                                    "Children" : null
                            }
                    ]
            }
    ]
}

То, чего я хочу добиться, это, прежде всего, найти 2-й элемент верхнегоУровень Distributions массив путем сопоставления "DeliveryType" : 1 и "DeliverySubType" : 3, а затем найдите 1-й элемент его вложенного массива DistributionData, сопоставив "Key": "Topic" и "Value" : "Topics", и, наконец, обновите поле Children сопоставленного вложенного массиваelement.

Для соответствия на верхнем уровне я попробовал следующие формы ...

{
  "arrayFilters": [
  { "filter1" : {
      "elemMatch" : {
         "DeliveryType" : 1,
         "DeliverySubType" : 3,
       }
     }
  }
}

и назвал фильтр как Distributions.$[filter1]..., но он не работал.Или,

{
  "arrayFilters": [
  { "filter1.Distributions" : {
      "elemMatch" : {
         "DeliveryType" : 1,
         "DeliverySubType" : 3,
       }
     }
  }
}

и ссылался на фильтр как $[filter1].Distributions...., но снова он завершился с ошибкой синтаксического анализа.

Все примеры, которые я могу найти, касаются использования arrayFilters навложенные массивы и я имели некоторый успех в этом отношении, но как бы я ни старался применить те же трюки к фильтрам в массиве верхнего уровня, они просто терпели неудачу со всеми видами ошибок.Может ли кто-нибудь помочь, пожалуйста?Спасибо.

1 Ответ

0 голосов
/ 18 сентября 2018

Решение несколько скрыто, но на самом деле задокументировано :

db.collection.update({}, {
    $set: { "Distributions.$[distFilter].DistributionData.$[distDataFilter].Children": "new value" }
    }, {
    "arrayFilters": [
        {
            "distFilter.DeliveryType" : 1,
            "distFilter.DeliverySubType" : 3
        }, {
            "distDataFilter.Key" : "Topic",
            "distDataFilter.Value" : "Topics"
        }
    ]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...