Как указать c, я должен быть в командах обновления MongoDB, для производительности? - PullRequest
2 голосов
/ 08 января 2020

Мне любопытно, что следует указывать в запросе where при выполнении команды updateMany с mon goose.

Например, с учетом этой операции обновления: { $pull: { tags: { $in: ["tagone", "tagtwo"] } } }

Должен ли запрос where быть:

{organisation: "fffffff..."} или {organisation: "fffffff...", tags: {$in: ["tagone", "tagtwo"]}

Может ли дополнительная специфичность в запросе where улучшить или снизить производительность, или ничего не изменить?

( Индексы базы данных не применяются)

1 Ответ

2 голосов
/ 08 января 2020

Я бы добавил несколько вещей из того, что знаю. Пожалуйста, обновите это, если есть какие-либо улучшения:

1) Хорошо, подумайте об этом так, если у вас нет указанного фильтра и нет индексов - тогда запрос будет перебирать все документы в коллекции, искать в массиве tags значения, переданные во входном массиве, и извлекать эти значения, если они существуют в tags. В каждом массиве документов tags необходимо искать значения.

2) Если у вас есть фильтр - даже тогда, когда у вас не включены индексы, запрос должен сканировать все документы в коллекция, которая является collection scan, и затем она будет проходить через отфильтрованные документы (сопоставленные документы из предоставленного фильтра) и обновлять массив tags.

Зачем нам нужны индексы в коллекции и фильтры в запросе?

Прежде всего, почему вы хотели бы сделать это без применения индексов? Каждая коллекция должна быть должным образом проиндексирована.

Итерация по индексным ключам (значениям индексированного поля) в памяти и извлечение фактических документов с диска, их обновление и запись обратно будут быстрыми с использованием индексов, с другой стороны, имея фильтры позволят выполнить запрос через меньшее количество документов или индексных ключей (если они проиндексированы) для обработки любых обновлений или в случае агрегирования для любых преобразований документа на последующих этапах.

...