×Закрыть

Як зафіксувати запит з MongoDB, яка оновлюється?

Роблю запит в Python до MongoDB

v=db.pages.find(...)

далі циклом обробляю запит

for item in v:
    ...bla bla bla ...
    print(v.count())

по ходу циклу v i v.count() змінюються, оскільки база даних оновлюється безперервно. Як зафіксувати v перед циклом, щоб він не мінявся?

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Я когда питон учил сделал эту же ошибку в упражнении, втыкал в код минут 20 бггг

Можна витягнути дані одразу, а не оперувати курсором.

v = list(db.pages.find(...))

for item in v:
    # ...bla bla bla ...
    print(v.count())

а с чего вы решили что оно вытянет все одним куском, это конешно давно было (7 лет назад) но если мне память не изменяет то у монги есть какойто лимит сколько документов она отдает за один ответ и дальше нужно делать OP_GETMORE
docs.mongodb.com/...​ce/mongodb-wire-protocol
просто бингдинги к питону делают это сами

Є обмеження на агрегацію та при сортуванні. Але на звичайний запит — ніби нема:
docs.mongodb.com/manual/reference/limits

Навіть якщо є, PyMongo просто буде робити кілька запитів, і потім все складе в один list

сортування не роблю, тільки умови >, <, ==

numberToReturn Limits the number of documents in the first OP_REPLY message to the query If numberToReturn is 0, the db will use the default return size

насколько я помню оно что то в около 100 по дефолту.

Думаю, що топікстартеру треба просто перевірити чи достатньо документів повертається.

мені потрібно витягнути всі документи згідно запиту, які є в базі даних в даний момент часу time. Причому цей час time має бути одинаковий для всіх документів. Такий собі миттєвий знімок бази даних, без розмазування тих хто біжить, якщо говорити мовою фото.

github.com/...​/master/pymongo/cursor.py
при использовании курсора делается несколько запросов under the hood и вернутся все(если такое вообще можно про монго говорить) документы

проблема в том что между запросами может произойти write операция которая может попасть/не попасть в ответ
еще раз процитирую

Even in snapshot mode, objects inserted or deleted during the lifetime of the cursor may or may not be returned.

не знаю какая там у автора ситуация, и может его такое устраивает, но в общем случае никаких ACID гарантий монга не дает и банальный апдейт нескольких документов за раз уже проблема.

хіба якщо використовувати write_concern

вангую что никак, наверно приплыли к тому моменту что нужны транзакции а в монге их нет

а конвертувати скопом і швидко в щось в RAM?

docs.mongodb.com/...​tion-consistency-recency
MongoDB cursors can return the same document more than once in some situations. As a cursor returns documents other operations may interleave with the query. If some of these operations are updates that cause the document to move (in the case of MMAPv1, caused by document growth) or that change the indexed field on the index used by the query; then the cursor will return the same document more than once.

docs.mongodb.com/...​snapshot/#cursor.snapshot
Здається cursor.snapshot() потрібен
Append the snapshot() method to a cursor to toggle the „snapshot” mode. This ensures that the query will not return a document multiple times, even if intervening write operations result in a move of the document due to the growth in document size.
але видає
AttributeError: ’Cursor’ object has no attribute ’snapshot’

cursor.snapshot()

это mongo shell

для питона нужно писать db.pages.find(..., snapshot = True)
Deprecated the `snapshot` option, which is deprecated in MongoDB 3.6 and removed in MongoDB 4.0.

docs.mongodb.com/...​e/operator/meta/snapshot
Even in snapshot mode, objects inserted or deleted during the lifetime of the cursor may or may not be returned.

если вкратце то у монго все очень плохо на тему ACID
en.wikipedia.org/wiki/ACID

транзакції тут ні до чого...

если еще не приплыли к тому моменту что нужны транзакции то нужно быть очень увереным что они действительно не понадобятся чтобы выбрать монгу

Це окреме питання до автора чому MongoDB, але не варто розводити дискусію на цю тему.

автора чому MongoDB

це не я вибирав.
Яку базу треба було би вибрати для швидко оновлюваних даних?

Подписаться на комментарии