Ограничения размера селектора запросов Cloudant/Mango

В нашей системе нам нужно знать, существует ли ссылка на конкретный идентификатор документа где-либо в базе данных. (например, чтобы разрешить / запретить удаление)

Ранее это работало хорошо с созданным нами представлением, но теперь нас попросили сделать то же самое, используя селекторы запросов Cloudant.

Мы придумали решение ниже, где мы включили все возможные пути, где будет найдена ссылка на документ. Запрос генерируется динамически, чтобы включить все возможные пути для ссылки "внешнего ключа", однако это означает, что ему потребуется масштабировать до потенциально +100 уникальных путей (т. Е. Массив операторов $ или может иметь в итоге +100 элементов)

Интересно, будет ли работать такой большой запрос, а также возможные последствия для производительности. Также, если есть альтернативный способ, который мы хотели бы знать.

{
   "selector": {
      "$or": [
         {
            "content": {
               "$elemMatch": {
                  "accounts": {
                     "$elemMatch": {
                        "bank": "bank12345"
                     }
                  }
               }
            }
         },
         {
            "content": {
               "$elemMatch": {
                  "partners": {
                     "$elemMatch": {
                        "someEntity": "someReference12345"
                     }
                  }
               }
            }
         }
      ]
   },
   "fields": [
      "_id",
      "_rev"
   ]
}

2 ответа

Итак, позвольте мне сделать это правильно - вы ранее использовали представление для простого поиска, который отлично работал, был эффективен и прост в проверке, и вас попросили вместо этого сделать селектор CQ с сотнями предложений?

Зачем? Это просто безумие. Это работа для представления.

Оставив это на некоторое время, я предполагаю, что вы используете для этого индексы JSON. Ваше выступление почти наверняка будет ужасно плохим, кстати. Вам нужно заранее создать индексы для всех битов, по которым вы хотите выполнять запросы, или вы можете закончить полное сканирование БД вместо поиска по индексу.

Не видя ваших документов, трудно предложить больше, чем общий совет. Похоже, ваши документы большие и / или содержат массивы, которые вы в худшем случае обновляете со временем. Я не могу придумать какой-либо другой вероятный способ, почему вы бы предпочли использовать селектор с более чем несколькими предложениями. Не могли бы вы разделить partners массив в отдельные документы вместо?

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

Другие вопросы по тегам