Изначально я искал волшебный моно-однострочный запрос, чтобы выполнить эту работу, но я думаю, что воспользуюсь этой идеей!
Наконец, я использовал следующее решение Java:
private void updateNestedInCollectionAWithTypeFromCollectionBWhereIdsMatch(List<CollectionBPojo> collectionB, MongoCollection<Document> collectionA) {
StreamUtils.createStreamFromIterator(collectionA.find().iterator()).forEach(d -> {
final List<Document> nestedList = (List<Document>)d.get("nested");
for (int i = 0; i < nestedList.size(); i++) {
final Document nested = nestedList.get(i);
if(!nested.containsKey("type")) {
final String id = nested.getString("id");
final Optional<CollectionBPojo> collectionBPojo = collectionB.stream().filter(g -> g.getId().equals(id)).findFirst();
if (collectionBPojo.isPresent()) {
final String type = collectionBPojo.get().getType();
final Document query = new Document("id", d.get("id"));
final Document update = new Document();
update.append("$set", new BasicDBObject("nested" + "." + i + ".type", type));
updates.add(new UpdateOneModel<>(query, update));
}
}
}
});
if(!updates.isEmpty()) {
final BulkWriteResult result = pipelineRunsCollection.bulkWrite(updates);
} else {
System.out.print.ln("Nothing to update on db: " + db.getName());
}
}
}