在 MongoEngine 中更新和嵌入文档

Upsert and embedded documents in MongoEngine

我正在构建一个从 API 中提取数据并将其保存到 MongoDB 的工具。为此,我正在使用 Python3 和 MongoEngine。

我可以提取数据并保存。这是它在 Mongo 中的样子:https://pastebin.com/hjMtCznc

这是我用来保存数据的 Python 代码: https://pastebin.com/kqJw8VAc

这行得通。但是我想每小时 运行 这段代码。那么如果有新的

   "campaign_id": "345775",
   "zone_id": "5609698",

我想创建这个(更新插入)

如果组合已经存储,我想以这种方式将数据附加到嵌入式集合。

{
  "_id": ObjectId("5ac8afa99d74e2e592586946"),
  "campaign_id": "345775",
  "zone_id": "5609698",
  "timeData": [
    {
      "t1": ISODate("2018-04-07T00:00:00Z"),
      "t2": ISODate("2018-04-07T13:46:48Z"),
      "clicks": 1,
      "unique_clicks": 1,
      "unique_visits": 15,
      "conversions": 1,
      "visits": 17,
      "payout": 80
    },
    {
      "t1": ISODate("2018-04-07T00:00:00Z"),
      "t2": ISODate("2018-04-07T14:46:48Z"),
      "clicks": 0,
      "unique_clicks": 0,
      "unique_visits": 1,
      "conversions": 0,
      "visits": 1,
      "payout": 0
    }
  ]
}

这是我在 Pymongo 中定义的数据库结构:https://pastebin.com/1MreN3uB

我尝试 line.update(upsert=True) 而不是 line.save()

提前致谢!

执行 Document updatenumline 推入 TrackerData 文档的 timeData 字段,同时在文档不存在时进行更新。 例如

from mongoengine.errors import OperationError

try:
    (
        TrackerData.objects(
            campaign_id=doc["campaign_id"],
            zone_id=doc["token_1"]
        )
        .update(
            push__timeData=numline, upsert=True
        )
    )
except OperationError as e:
    logger.error(e)