【问题标题】:mongodb micro-optimization of batch inserts ? or is this an important optimization?批量插入的mongodb微优化?或者这是一个重要的优化?
【发布时间】:2017-07-08 19:46:40
【问题描述】:

前提:更新语句是无害的,因为驱动程序默认以一种方式发送消息(只要不使用getLastError)。

问题以下片段是在 mongodb 中进行大容量插入的最佳方法吗?第2步和第3步可以折叠吗?

编辑:旧的错误形式,见下文

// step 1 : making sure the top-level document is present (an upsert in the real 
            example)
db.test.insert( { x :1} )

// step 2 : making sure the sub-document entry is present
db.test.update( { x:1 }, { "$addToSet" : { "u" : { i : 1, p : 2 } } }, false)

// step 3 : increment a integer within the subdocument document
db.test.update( { x : 1, "u.i" : 1}, { "$inc" : { "u.$.c" : 1 } },false)

我感觉没有办法退出操作 3,因为$ 运算符需要在更新的查询部分的查询字段中启动。阿米特?亚美特?

如果这是做事的最佳方式,我可以在我的代码中发挥创意并为更新操作发疯吗?

编辑:新表单

我的逻辑中有一个错误,谢谢盖茨。如果可能的话,仍然想折叠更新:D

// make sure the top-level entry exists and increase the incidence counter
db.test.update( { x : 1 }, { $inc : { i : 1 } }, true ) --1

// implicetly creates the array
db.test.update(   { x : 1 , u : { $not : { $elemMatch : { i : 1 } } } } , 
                  { $push : { u : { i : 1 , p :2 , c:0} } }) -- 2

db.test.update( { x :1 , "u.i" : 1}, { $inc : { "u.$.c" : 1 } },false) --3

注意:$addToSet 在这种情况下没有用处,因为它进行元素匹配,所以无法像 C++ OO 按位比较用语那样表达数组中的哪些元素可能是 mutable

问题毫无意义 数据模型错误。请投票关闭 (OP)。

【问题讨论】:

    标签: mongodb document-oriented-db database nosql


    【解决方案1】:

    所以,首先要注意的是$ 位置运算符有点粗略。它有很多“陷阱”:它不能很好地处理 upsert,它只会影响第一个真正的匹配,等等。

    要了解 #2 和 #3 的“折叠”,您需要查看命令的输出:

    db.test.insert( { x :1} )
    { x:1 } // DB value
    
    db.test.update( { x:1 }, { "$addToSet" : { "u" : { i : 1, p : 2 } } }, false)
    { x:1, u: [ {i:1,p;2} ] } // DB value
    
    db.test.update( { x : 1, "u.i" : 1}, { "$inc" : { "u.$.c" : 1 } },false)
    { x:1, u: [ {i:1,p:2,c:1} ] } // DB value
    

    根据您提供的顺序,可以将整个内容整合到一个更新中。

    如果您只想将 #2 和 #3 组合在一起,那么您会担心将 'u.i':1u.$.c 匹配。但是这里有一些边缘情况你必须澄清。

    让你的起始文件如下:

    { 
      x:1, 
     u: [ 
          {i:1, p:2},
          {i:1, p:3}  
        ] 
    }
    

    您对运行更新 #3 有何期望?

    如你所见:

    { 
      x:1, 
     u: [ 
          {i:1, p:2, c:1},
          {i:1, p:3}  
        ] 
    }
    

    这是正确的吗?第一份文件合法吗? (语义正确)?根据答案,这实际上可能是文档结构的问题。

    【讨论】:

    • 你是对的,这是非法的。 'c' 应该是集合的可变元素:/.
    猜你喜欢
    • 2021-01-07
    • 2012-11-10
    • 2019-06-24
    • 2014-01-16
    • 2018-09-04
    • 2013-11-19
    • 2013-10-14
    • 2012-10-16
    • 2013-01-20
    相关资源
    最近更新 更多