MongoDB - как добавить поле во вложенный объект в одной коллекции, используя поле из другой коллекции? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть две коллекции A и B.

Коллекция A имеет вложенный объект 'nested', который имеет поле 'id'.Коллекция B также имеет поле 'id' и еще один 'type'.

Мой вопрос:

Как я могу добавить поле 'type' коллекции B к вложенному объекту коллекции A, гдесовпадение идентификатора?

1 Ответ

0 голосов
/ 27 февраля 2019

Изначально я искал волшебный моно-однострочный запрос, чтобы выполнить эту работу, но я думаю, что воспользуюсь этой идеей!

Наконец, я использовал следующее решение 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());
    }
}

}

...