如果发现文档,我将尝试更新文档,否则插入如下
upserts = [UpdateOne({"$and":[{'_id': x['_id']},{'time':{"$lt": x['time']}}]},
{'$setOnInsert': x, '$set':{'time':x['time']}},
upsert=True) for x in batch]
collection.bulk_write(upserts)
然而,我得到了以下错误:
Updating the path 'time' would create a conflict at 'time'
我知道发生这种情况是因为time
密钥在set
和setOnInsert
中都在更新。我无法在setOnInsert
中指定字段,因为键不是固定的。如果允许在setOnInsert中排除字段,那么我可以在其中排除time
。
我该如何解决这个问题?
插入文档时,将同时处理$set
和$setOnInsert
文档。
查询执行器拒绝在一次更新中两次更新同一字段。
您可以尝试使用字典理解从$setOnInsert中删除时间字段,例如:
'$setOnInsert': {i:x[i] for i in x if i!='time'}