我试图在mongodb中维护一些计数器,所以我需要定期更新它们。当数据结构为单个级别时,我的代码可以正常工作:
mlcol.find_one_and_update({"connip": conip}, {"$inc":{ts:1}}, upsert=True)
结果是这样的结构:
{
"connip": "a",
"1":1,
"2":1,
"3":1,
"4":1
}
我想将数据结构转换为如下形式:
{
"connip": "a",
"timeline": [
{
"timeslot": "1",
"counter": 1
},
{
"timeslot": "2",
"counter": 1
}
]
}
当我发送此命令时:
mlcol.find_one_and_update({"connip": "a", "timeline.timeslot": "c"}, {"$inc":{"timeline.$.counter":1}}, upsert=True)
我获得了已经存在的计数器的正确更新,但是如果是新计数器,则会收到以下错误:
pymongo.errors.OperationFailure: The positional operator did not find the match needed from the query.
似乎有必要首先启动insetr_one命令:
ne = {"connip": "a","timeline":[{"timeslot": "c","counter":1},{"timeslot": "d","counter":1}]}
mlcol.insert_one(ne)
在以前不存在计数器的情况下,是否有任何方法可以强制创建计数器?平面结构中的命令可以正确执行此操作。