Есть способ сделать какое-то левое соединение на CouchDB? - PullRequest
1 голос
/ 22 января 2020

У нас есть документы по умолчанию, которые создаются системой, но пользователь может их "переопределить". Это означает, что создайте копию документа, принадлежащего «системе». В результате это модифицированная версия документа со свойством "owner" = "username". Пользователи могут читать только свой собственный документ и, если он не существует, система по умолчанию. Итак, вопрос: существует способ _определения документов с помощью селектора или с помощью функций, способных возвращать системные документы, но, если есть документ, определенный пользователем, это должно быть возвращено вместо системных значений по умолчанию.

Параметры, используемые для запроса: имя пользователя и имя документа

Общая структура документа:

{"_id": "...", "docname": " do c name "," owner ":" Имя системы или пользователя "}

1 Ответ

0 голосов
/ 23 января 2020

Как показано в вопросе, можно в основном достичь желаемого результата с помощью индекса Man go и запроса.

Сначала создайте индекс для владельца и docname

{
   "index": {
      "fields": [
         "docname",
         "owner"
      ]
   }
}

Чтобы запросить у владельца Джона Доу «do c name 3»,

{
   "selector": {
      "$and": [
         {
            "docname": "doc name 3"
         },
         {
            "owner": {
               "$or": [
                  "System",
                  "John Doe"
               ]
            }
         }
      ]
   }
}

Предположим, что Джон Доу не получил их В собственной версии "do c name 3" результатом будет просто системный документ, например

{
 "_id": "821985c5140ca583e108653fb6031665",
 "_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
 "docname": "doc name 3",
 "owner": "System"
}

Пока все хорошо. Если Джон Доу вывел свою собственную версию "do c name 3", результат будет в 2 строки:

{
 "_id": "821985c5140ca583e108653fb6031665",
 "_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
 "docname": "doc name 3",
 "owner": "John Doe",
},
{
 "_id": "821985c5140ca583e108653fb6031665",
 "_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
 "docname": "doc name 3",
 "owner": "System"
}

OK, ну, это не так уж и здорово, потому что код должен выбирать победителя, потому что если владельцем является Зейн Грей, системный документ должен отображаться первым (сопоставление).

Вот почему я сказал в основном выше, поскольку поле owner проблематично c - «Система» действительно мешает именам пользователей. Чтобы обойти эту проблему, нужно указать порядок сортировки в поле владельца на основе имени пользователя по сравнению с системой - но это грязно, хм.

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

Сохранение вещей в том виде, в котором они были представлены, но теперь предполагается производное поле присутствует в документах. Добавьте новый индекс для производного поля с помощью сортировки:

{
   "index": {
      "fields": [
         { "derived": "desc" }
      ]
   }
}

Теперь этот Man go запрос

{
   "limit": 1,
   "selector": {
      "$and": [
         {
            "docname": "doc name 3"
         },
         {
            "owner": {
               "$or": [
                  "System",
                  "John Doe"
               ]
            }
         }
      ]
   }       
}

Производит либо Системный документ или версия, производная от пользователя.

Ключ имеет значение по умолчанию "sort": "desc", которое всегда будет сначала представлять производные документы и поэтому "limit": 1 предоставляет результат одного документа; если производный документ для Джона Доу существует и ограничение равно 2, результат будет примерно таким же, как

{
 "_id": "821985c5140ca583e108653fb6031665",
 "_rev": "3-6de569538ee2b96c3029b10dc052aa6d",
 "docname": "doc name 3",
 "owner": "John Doe",
 "derived": 1
},
{
 "_id": "821985c5140ca583e108653fb602f396",
 "_rev": "3-34f29216b467fe21c65db3e4f1a638ac",
 "docname": "doc name 3",
 "owner": "System",
 "derived": 0
}

. Я использовал Fauxton + CouchDB 2.3, чтобы проверить свою работу здесь. У гуру CouchDB может быть превосходное решение. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...