• 1000
import pymongo
client = pymongo.MongoClient()
client.drop_database('delete_it')
db = client.delete_it
def first_position(position):
db.position.update_one(
filter={
'position': position
},
update={
'$setOnInsert': {
'position': position
},
'$inc': {
'counts': 1,
}
},
upsert=True
)
def next_position(position, move, previous_position):
db.position.update_one(
filter={
'position': previous_position,
},
update={
'$addToSet': {
'next_positions': {
'position': position,
'move': move,
}
},
}
)
db.position.update_one(
filter={
'position': previous_position,
'next_positions.position': position
},
update={
'$inc': {
'next_positions.$.counts': 1
},
}
)
# first
position = 0
first_position(position=position)
# second
previous_position = 0
move = 1
position = 1
next_position(position=position, move=move, previous_position=previous_position)
previous_position = 0
move = 1
position = 1
next_position(position=position, move=move, previous_position=previous_position)
Все работает, но генерирует дублированные счетчики. Могу ли я сделать какое-то условие для обновления, чтобы не допускать дублирования с $addToSet
. Я хочу добавить пару position
и move
(игнорируя значение счетчика), если счетчик еще не создан?
Этот код генерирует дубликаты:
{"_id":{"$oid":"5eb2c732407e06da40d56638"},"position":{"$numberInt":"0"},"counts":{"$numberInt":"1"},"next_positions":[
{"position":{"$numberInt":"1"},"move":{"$numberInt":"1"},"counts":{"$numberInt":"2"}},
{"position":{"$numberInt":"1"},"move":{"$numberInt":"1"}}
]}
Он должен просто обновить счетчики (одна запись):
{"_id":{"$oid":"5eb2c732407e06da40d56638"},"position":{"$numberInt":"0"},"counts":{"$numberInt":"1"},"next_positions":[
{"position":{"$numberInt":"1"},"move":{"$numberInt":"1"},"counts":{"$numberInt":"2"}},
]}
Может быть, должно быть какое-то условное $addToSet
. Я хочу использовать его в массовом режиме, но без проблем, если вы предложите решение, не использующее массовый режим. Любая помощь приветствуется.