Пн go как я могу выполнить условное обновление с помощью $ addToSet? - PullRequest
0 голосов
/ 06 мая 2020
• 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. Я хочу использовать его в массовом режиме, но без проблем, если вы предложите решение, не использующее массовый режим. Любая помощь приветствуется.

...