Пн goose: Pushign для массива объектов - PullRequest
0 голосов
/ 16 марта 2020

У меня есть схема Mon goose, подобная следующей:

{
  ...
  websites: [
    {
      site_address: String,
      tests: [
        {
          ...
          results: String
          type: String
        }
      ]
    }
  ]
}

Я хочу иметь возможность проверить, существует ли уже site_address, если нет, создать новую запись в websites с указанным site_address.

Когда существует site_address, я хочу вставить новый объект в массив tests.

Есть ли способ сделать все это одной командой

1 Ответ

0 голосов
/ 16 марта 2020

Если у вас есть способ выбора всего документа, да. Метод update примет конвейер агрегации в качестве второго аргумента, который будет применен к соответствующим документам.

Есть несколько способов, которыми это может быть достигнуто. Одна из возможностей: - использовать $reduce, чтобы разделить массив веб-сайтов на совпадающие и оставшиеся массивы, - создать элемент-заглушку, если ни один не совпадает, или извлечь первый элемент из массива совпадений - добавить новый тест в массив тестов - добавить Элемент сайта к оставшемуся массиву - удалите временные поля

address="NewString";
testElement={result:"NewString",type:"NewString"}; 
Collection.update({},[
    {$set:{
           match_result:{
                         $reduce:{
                                  input:"$websites",
                                  initialValue:{matched:[],remain:[]},
                                  in: {
                                       matched:{$cond:[{$eq:["$$this.site_address",address]},{$concatArrays:["$$value.matched",["$$this"]]},"$$value.matched"]},
                                       remain:{$cond:[{$ne:["$$this.site_address",address]},{$concatArrays:["$$value.remain",["$$this"]]},"$$value.remain"]},
                                  }
                         }
           }
    }},
    {$set:{
        new_site:{$cond:[{$eq:[{$size:"$match_result.matched"},0]},{site_address:"NewString",tests:[]},{$arrayElemAt:["$match_result.matched",0]}]}
    }},
    {$set: { "new_site.tests":{$concatArrays:["$new_site.tests",[testElement]]}}},
    {$set:{ websites:{$concatArrays:["$match_result.remain",["$new_site"]]}}},
    {$project: {
        match_result:0,
        new_site:0
    }}
])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...