Если у вас есть способ выбора всего документа, да. Метод 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
}}
])
Это может в конечном итоге выполнить хуже, чем отдельный запрос с последующим обновлением, поэтому некоторые проверки должны быть в порядке.