mongodb - MongoDB - 如何使用另一个集合中的字段将字段添加到一个集合中的嵌套对象?
问题描述
我有两个集合 A 和 B。
集合 A 有一个嵌套对象“nested”,其中有一个字段“id”。集合 B 也有一个字段“id”和另一个“类型”。
我的问题是:
如何将集合 B 的“类型”字段添加到集合 A 的嵌套对象中,其中 id 匹配?
解决方案
最初,我正在寻找一个神奇的 mongo 单行查询来完成这项工作,但我想我会利用这个想法!
最后,我使用了以下 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());
}
}
}
推荐阅读
- python - Python如何将字典与范围合并?
- excel - Excel 公式在单元格格式更改为“文本”之前不会返回结果
- python - dict.__setitem__(key, x) 是否比 dict[key] = x 慢(或快),为什么?
- flutter - Flutter - 值正在更新,但如果状态不再起作用
- ffmpeg - 如何使用 RTMPS 协议从 URI 获取实时流媒体
- python - 将数据框附加到同一个工作表
- javascript - 如何将 javascript 地图对象的内容呈现为列表?
- android - 在移动设备上运行时将 mysql db 与 Android 连接时出错
- azure-devops - 如何使用本地代理在 Azure DevOps Server 2020 中的给定构建代理处对 YAML 构建进行排队?
- vuejs3 - 如何在 vue3 中访问 slot 动态组件?