Как обновить глубоко вложенный массив с C # MongoDB.Driver? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть такая модель:

{  
   "_id":"5b90eea8c02e062be2888446",
   "storeGuid":"e97d4730-9b8a-49ed-be87-caf4054439aa",
   "storeId":"0",
   "storeDbName":"0",
   "tenant":"dev",
   "configGroup":[  
      {  
         "groupName":"peopleCounter",
         "config":[  
            {  
               "key":"averageWaitPeriodTime",
               "value":"60",
            }
         ]
      },
      {  
         "groupName":"sessionMonitor",
         "config":[  
            {  
               "key":"testKey1",
               "value":"987",
            },
            {  
               "key":"testKey2",
               "value":"123",
            }
         ]
      }
   ]
}

Я пытаюсь обновить value для "key":"testKey2"

У меня есть такое заявление об обновлении:

await coll.UpdateOneAsync(
    x => x.StoreGuid == storeGuid
         && x.ConfigGroup.Any(y => y.GroupName == groupName
                                   && y.Config.Any(z => z.Key == model.Key)),
    Builders<StoreModel>.Update.Set(x => x.ConfigGroup[-1].Config[-1].Value, model.Value));

Когда я пытаюсь обновить, например, groupName, используя такой фильтр ConfigGroup[-1], он работает.

Но в случае, если у нас есть ConfigGroup[-1].Config[-1], он не работает.

Я знаю два вариантакак обновить значение:

  • просто обновить весь список, используя ConfigGroup[-1].Config
  • или указать конкретные индексы для фильтра, например ConfigGroup[configGroupIndex].Config[configKeyIndex].Value

Но яхочу знать, почему он не работает с индексом -1.И как это сделать правильно.

Пожалуйста, ответьте, используя c # MongoDB.Driver .

Заранее спасибо.

1 Ответ

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

Причина, по которой он не работает с умножением '-1', поскольку он совпадает с позиционным оператором $.В официальной документации по теме «Вложенные массивы» мы можем видеть следующее:

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

Начиная с MongoDb 3.6 , появились новые функции, позволяющие работать с вложенными массивами.

Все позиционный оператор

Отфильтрованный позиционный оператор :

Отфильтрованный позиционный оператор $[<identifier>] идентифицирует элементы массива, которые соответствуют arrayFiltersусловия для операции обновления

Итак, используя оператор отфильтрованной позиции, мой код теперь выглядит следующим образом:

await coll.UpdateOneAsync(x => x.StoreGuid == storeGuid,
    Builders<StoreModel>.Update.Set("configGroup.$[g].config.$[c].value", model.Value),
    new UpdateOptions
    {
        ArrayFilters = new List<ArrayFilterDefinition>
        {
            new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g.groupName", groupName)),
            new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("c.key", model.Key))
        }
    });
...