MongoEngine中的Upsert和嵌入式文档

时间:2018-04-07 12:06:49

标签: mongodb python-3.x pymongo upsert

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

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

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

这很有效。但我想每小时运行一次这段代码。然后,如果有新的

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

我想创建这个(upsert)

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

{
  "_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()

提前致谢!

1 个答案:

答案 0 :(得分:2)

当文档不存在时,执行Document updatenumline推送到TrackerData文档的timeData字段。 e.g。

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)