Как одним запросом перезаписать документы в MongoDB?
Добрый день. Суть вопроса в следующем:
есть n документов в коллекции в базе, есть m документов для записи в коллекцию, каждый документ имеет уникальный идентификатор "user", общий вид {"user": "22", "info": {...}}. Как мне одним присестом m документов запихнуть в коллекцию, причем так, чтоб если юзер совпал, он перезаписывал документ, а если нет - добавлял его в коллекцию? Ползал по документации, не нашел. Заранее спасибо.
Алексей, можно с этого места поподробнее? Я смотрел документацию по update, возможен апдейт множества документов критерию (критериям), но результирующее значение будет одинаковым. Я видимо что-то недопонимаю, не могли бы вы прояснить этот момент?
А как-то так я предпологал update, но хрень получается с ним, пробовал и upsert=True.
async def update_sorted_friends(user, cache, collect):
assert isinstance(cache, list), "uids isn't list" # list of dicts
result = await collect.update({"user":{"$in": [i["user"] for i in cache]}}, cache)
print('set_sorted_friends: %s' % repr(result))
return result
Алексей Ярков: там есть проблема - я не могу во второй параметр добавить список словарей (читай: будущих документов в базе), поскольку метод хочет словарь, в этом и проблема: он ждет статичного значения поля (полей), multi же позволяет лишь в множестве документов выставить одни и те же значения. А мне нужно вроде как сопоставить то что есть у меня, и то что есть в базе по ключу "user" в документ.
Алексей Ярков: проблема в том, что у меня под 100к таких документов под запись в базу, и еще 50к уже в базе, так что не особо удачная затея делать это в цикле по одному, поэтому я здесь.
Уже изменил. collect.update({}, {"$set": doc}, upsert=True). Все данные в пределах 1 документа, вопрос в том, когда кончатся 16 мб, выделенные на документ.