克隆mongodb集合中的多个交叉引用文档

克隆mongodb集合中的多个交叉引用文档,mongodb,pymongo,Mongodb,Pymongo,我有一个应用程序,供用户构建输入组件的层次组装。树太大,无法存储在单个文档中(想想汽车上的每个螺丝钉),因此每个分支和叶子都是一个单独的文档,具有交叉引用以保持层次结构 { '_id': 1, 'name': 'screw', 'partnum': 'ABC123' }, { '_id': 2, 'name': 'mountingplate', 'partnum': 'CBA321' }, { '_id': 3, 'name': 'widget', 'children': [1,2] } 其中

我有一个应用程序,供用户构建输入组件的层次组装。树太大,无法存储在单个文档中(想想汽车上的每个螺丝钉),因此每个分支和叶子都是一个单独的文档,具有交叉引用以保持层次结构

{ '_id': 1, 'name': 'screw', 'partnum': 'ABC123' },
{ '_id': 2, 'name': 'mountingplate', 'partnum': 'CBA321' },
{ '_id': 3, 'name': 'widget', 'children': [1,2] }
其中一个功能将允许用户克隆一个现有的模型来玩,而不是从头开始(如果我用钛合金替换所有的铝支柱,重量和成本会如何变化?)。所以我有一个单独的“models”集合,每个组件都有一个“modelid”字段。因此,要克隆现有模型,到目前为止,我使用pymongo能想到的最佳方案是:

conversionmap = {}
#replace the modelid and individual component id
for doc in db.components.find({'modelid': oldmodelid}):
    conversionmap[doc['_id']] = bson.ObjectId()
    doc['_id'] = conversionmap[doc['_id']]
    doc['modelid'] = newmodelid
    db.components.insert_one(doc)
#go through a second time to update all the cross references
for doc in db.components.find({'modelid': newmodelid}):
    updatecrossrefs(doc, conversionmap)
    db.components.update_one(doc['_id'], doc)
这可能会导致大量的插入/更新查询!如果我将整个列表读入内存,我可以将插入和更新步骤合并为一个步骤,但我不确定这有多实际。批量写入似乎同样危险

有没有一种合理的方法可以通过服务器端javascript或聚合管道实现这一点?我不知道这些文档的完整结构,据我所知,使用
$project
是不可能的。使用多个集合会让事情变得更简单吗?(使用一百个不同的集合会有一些开销吗?)

编辑:一个可接受的答案可能包括“停止使用mongo,去找一个真正的RDBMS!”只要它能在不将一堆数据读入内存的情况下大大减少单独的查询