我有两个集合,一个(A)包含要处理的项目(相对较小),一个(B)包含已经处理的项目(相当大,有额外的结果字段).
项目从A读取,得到处理并保存()'d到B,然后从A中删除()'d .
理由是指数可以在这些指数之间有所不同,并且"传入"集合可以通过这种方式保持非常小和快.
我遇到了两个问题:
我可以回避使用findAndModify锁的双失败案例(否则不需要,我们有一个进程级锁)但是我们有过时的锁问题,部分失败仍然可能发生.据我所知,没有办法原子地删除+保存到不同的集合(可能是设计?)
这种情况有最佳实践吗?
我的应用程序跟踪整个系统中数据的移动。当记录移动时,它被放置在一个单独的集合中,该集合确定文档是在途中、可用还是停止服务。我使用 $addToSet 来放置 _id,并使用 $pullAll 来确保当文档从航路移动到可用时,它不会重复。但是当 _id 完全移动到新位置时,我需要从旧位置删除旧数据并将其插入新位置。插入有效,但我无法弄清楚如何从旧位置正确删除数据。这些都在 Meteor Calls 和 Mongodb 中
if last.status is "Enroute"
LastLocation.update locationId: last.locationId,partId: last.partId,
$addToSet:
enroutePurchaseIds: lastPurchaseId
$pullAll:
availiblePurchaseIds: lastPurchaseId
outOfServicePurchaseIds: lastPurchaseId
Run Code Online (Sandbox Code Playgroud) 我有一个python脚本,它每天收集数据并将其插入MongoDB集合(约1000万个文档)。有时,工作失败了,剩下的部分数据对我没有用。我想先将数据插入到暂存集合中,然后仅在作业完成且数据完成后才将所有文档从暂存集合中复制或移动到最终集合中。我似乎找不到作为“批量”类型操作执行此操作的直接解决方案,但似乎应该有一个解决方案。
在SQL中将是这样的:
INSERT INTO final_table
SELECT *
FROM staging_table
Run Code Online (Sandbox Code Playgroud)
我以为db.collection.copyTo()可以解决此问题,但似乎使目标集合成为源集合的克隆。
此外,我从中知道:mongodb将文档从一个集合移到另一个集合,我可以执行以下操作:
var documentsToMove = db.collectionA.find({});
documentsToMove.forEach(function(doc) {
db.collectionB.insert(doc);
}
Run Code Online (Sandbox Code Playgroud)
但是似乎应该有一个更有效的方法。
那么,如何才能从一个集合中获取所有文档,并以最有效的方式将它们插入到另一个集合中?
注意:最终集合中已经有数据。我要移动的新文档将添加到此数据中,例如,如果我的暂存集合有2个文档,而我的最终集合有10个文档,那么在转移暂存数据后,我的最终集合中将有12个文档。