【问题标题】:How to store Incremental Data in MongoDB?如何在 MongoDB 中存储增量数据?
【发布时间】:2015-12-24 10:37:47
【问题描述】:

我在各种集合中拥有数百万份文档。

我的应用程序必须定期将一些增量数据更新到 MongoDB。我如何做到这一点?

对于增量数据中的每条记录,如果记录存在,则必须使用新值对其进行更新,否则必须插入。

{
   _id: 'some ID',
   lifnr: 12345,
   bukrs: 3455,
   amount: 500
},
{
   _id: 'some ID',
   lifnr: 12346,
   bukrs: 3456,
   amount: 5200
}

假设上面是我的数据,以 lifnr 和 bukrs 作为具有唯一约束的复合索引。 {lifnr & bukrs} 值与任何现有值相同的任何新记录都应替换旧记录。如果它是唯一的 {lifnr & bukrs} 的新记录,那么它必须插入/附加它。

指导我的方法。谢谢

【问题讨论】:

  • 详细了解哪些数据和查询(也使用运算符)会有所帮助
  • 我是否过度简化了这一点,或者类似:db.col.update({lifnr:doc.lifnr,bukrs:doc.bukrs},doc,{upset:true}) 就足够了吗?这将使用新值更新或插入
  • @Sammaye 能解释一下吗?我是 Mongo 的新手!顺便说一句,它不是'upsert'吗?谢谢
  • 基本上doc 是一个包含您更改的文档的var,您通过复合索引中的两个条件值查询更新(因为异常抛出在查询中不起作用),然后您替换旧文档在第二个参数中带有新文档,或者如果找不到,则使用不高兴:true 插入新文档

标签: mongodb compound-index


【解决方案1】:

根据您的编辑,它并没有真正增加数据。它只是将 upsert 设置为 true 的更新。每次都要更新。查询将是,

db.collection.update(
  { lifnr: 12345, bukrs: 3455},
  {$set: {amount: 5600}}
  {upsert: true}
)

如果找到 linfr 和 bukrs 组合,上述查询将更新金额。如果没有找到,它将插入一个新文档。

【讨论】:

  • 我已经明确提到了“增量数据”而不是“增量数据”。不过感谢您的回答!
  • 所以在尝试了数百万条记录的解决方案后,我遇到了很大的延迟。因此,我切换到批量 upsert。它更新但不插入。代码 --> bulk.find(check_fields).upsert().update({"$setOnInsert": whole_doc, "$set":document });
  • 批量更新是数百万条记录的绝佳选择
猜你喜欢
  • 2019-03-01
  • 1970-01-01
  • 2014-03-10
  • 2018-04-15
  • 2023-03-25
  • 1970-01-01
  • 2023-01-03
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多