Как показано в вопросе, можно в основном достичь желаемого результата с помощью индекса 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 может быть превосходное решение. Удачи.