我正在寻找一种在添加属性的同时将多个文档从一个集合复制到另一个集合的有效方法。基本上,我有一个文件堆积的“假脱机空间”集合,在给定的时间,我必须添加一个特殊的元数据节点并将其推送到文档集合中。
限制和环境:
现在,我们正在以文档方式这样做:
spool.find(
eq("transfernode.id", currTransferId)
)
.forEach((Consumer<Document>) doc -> {
doc.append("execnode", createMarkerNode("somedata")); // creates a sub-doc
docs.insertOne(doc);
});
但是,这非常效率不高。
完美的事情是使用聚合管道并在$ project阶段添加节点,但不幸的是你必须包含投影的字段列表,正如我已经指出的那样,我们没有这样的列表因为结构未知(即由用户决定。)
(子问题:项目阶段可以用来包括所有而不知道这一切是怎么样的吗?)
下一个实验是使用MongoDB mapReduce。基本上,这可以轻而易举,但map-reduce的结果文档具有
形式{
_id: "anId",
value: {
... (this is the document I want)
}
}
(注意:我已经看到了问题的答案 [1]:mongoDB map/reduce minus the reduce但是在finalize函数中调用db.insert是不可能的。 Mongo文档声明绝对应该避免这种情况,我希望保持解决方案“干净”)
也许有办法以“批量”方式将价值部分“复制”到新文档中?
那么,有没有人知道如何实现这个目标?
编辑:在上面的原始问题文本中,我提到聚合管道似乎是一种可能的方式。与此同时,我发现聚合$ out阶段替换集合而不是更新它。因此,这也不能使用。 : - (