我正在尝试提高应用的性能以及我对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})