在MongoDB中,如果文件不存在,如何创建包含字段的文档,如果存在则增加值?

时间:2018-06-10 15:45:14

标签: python mongodb

我正在尝试提高应用的性能以及我对MongoDB的了解。我已经能够执行激活并忘记查询,如果它们不存在则创建字段,否则按如下方式增加值:

date = "2018-6"
sid = "012345"
cid = "06789"

key = "MESSAGES.{}.{}.{}.{}".format(date, sid, cid, hour)

db.stats.update({}, { "$inc": { key : 1 }})

这将生成具有以下结构的单个文档:

文件:

{
  "MESSAGES": {
    "2018-6": {
      "012345": {
        "06789": 1
      },
      "011111": {
        "06667": 5
      }
    },{
    "2018-5": {
      "012345": {
        "06789": 20
      },
      "011111": {
        "06667": 15
      }
    }
  }
}

正如您可能想象的那样,通过增加数据来查询此结构已成为一个噩梦。我想实现相同的火灾并忘记查询,但实现了更好的可索引模式。类似的东西:

文件:

[{ 
  "SID": "012345",
  "MESSAGES: {
    "MONTHS": {
       "KEY": "2018-6",
       "CHANNELS": {
         "KEY": "06789",
         "COUNT": 1
       }
    },{
      "KEY": "2018-5",
      "CHANNELS": {
        "KEY": "06667",
        "COUNT": 20
        }
    }
  } 
},
{ 
  "SID": "011111",
  "MESSAGES: {
    "MONTHS": {
      "KEY": "2018-6",
      "CHANNELS": {
        "KEY": "06667",
        "COUNT": 5
        }
    },{
      "KEY": "2018-5",
      "CHANNELS": {
        "KEY": "06667",
        "COUNT": 15
        }
    }
  } 
}]

我正在处理大量数据,这些查询可能每秒发生多次,因此,如果可能的话,我只执行一次这样的事情非常重要。我们非常欢迎您提供任何建议,也可以批评您在此处看到的任何建议,因为我的目标是学习。

提前致谢!

用ATTEMPT更新:

db.test.updateOne({"SERVER_ID": "23894723487sdf"}, {
"$addToSet" : {
    "MESSAGES" : {
        "DATE": "2018-6",
        "CHANNELS": [{
            "ID": "239048349",
            "COUNT": NumberInt(1)
        }]
    }
},
"$inc" : {
    "MESSAGES.CHANNELS.$.COUNT" : 1

}}, 
{upsert: true})

0 个答案:

没有答案