В MongoDB как создать документ с полями, если они не существуют, и увеличить значение, если оно существует? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь улучшить производительность своего приложения и свои знания MongoDB.Мне удалось выполнить запрос на запуск и забыть, который создает поля, если они не существуют, и в противном случае увеличивает значение следующим образом:

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

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

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

Это создает один документ со следующей структурой:

document:

{
  "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
        }
    }
  } 
}]

Я работаю с довольно большим объемом данных, и эти запросы могут выполняться много раз в секунду, поэтому важно, чтобы я просто выполнял что-тоодин раз, если это вообще возможно.Любой совет, который вы можете дать, очень приветствуется, не стесняйтесь критиковать все, что вы видите здесь, так как моя цель - учиться.

Заранее спасибо!

ОБНОВЛЕНО ПОПЫТОКОМ:

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

}}, 
{upsert: true})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...