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

时间:2016-09-06 18:53:34

标签: mongodb pymongo

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

{ '_id': 1, 'name': 'screw', 'partnum': 'ABC123' },
{ '_id': 2, 'name': 'mountingplate', 'partnum': 'CBA321' },
{ '_id': 3, 'name': 'widget', 'children': [1,2] }

其中一个功能是让用户克隆现有模型而不是从头开始(如果我用钛替换所有铝支柱,重量和成本如何变化?)。所以我有一个单独的模型'集合,每个组件都有一个'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!"只要它在没有读入内存的情况下,它可以显着减少单独的查询。

0 个答案:

没有答案