Couchbase lite N1QL: как запросить массив для массива значений - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть такие данные:

{
mydata:
[
{
title: "item 1",
languages: ["en", "fr", "it", "pl"]
},
{
title: "item 2",
languages: ["fr", "es", "pt"]
},
{
title: "item 3",
languages: ["en", "it"]
}
]
}

Как я могу запросить элементы в массиве, такие как ["en", "it"]? Он должен соответствовать всем элементам данных, которые содержат либо «en», либо «it» (или оба) в языках?

Большое спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

В документации по операциям по сбору есть несколько примеров на эту тему https://docs.couchbase.com/couchbase-lite/2.1/swift.html#collection-operators

0 голосов
/ 25 ноября 2018

ОК, я понял, как это сделать. Для всех, кому интересно:

func getIdsByPropertyArray(_ property:String, values:[String]) -> Set<String> {
    var matchingIds = Set<String>()

    var whereExpr:ExpressionProtocol = ArrayFunction.contains(Expression.property(property), value:Expression.string(values[0]))
    for i in 1..<values.count {
       whereExpr=whereExpr.or(ArrayFunction.contains(Expression.property(property), value: Expression.string(values[i])))
    }

    let query = QueryBuilder
        .select(
            SelectResult.expression(Meta.id)
        )
        .from(DataSource.database(database))
        .where(whereExpr)
    do {
        for result in try query.execute() {
            matchingIds.insert(result.string(forKey: "id")!)
        }
    } catch let error {
        print(error.localizedDescription)
    }
    return matchingIds
}

Это работает, но: это очень медленно! Это займет около 4 секунд с набором данных из 1000 документов. Теперь я получаю все документы из базы данных и сортирую те, которые мне нужны, с помощью Reduce. Это займет всего около 0,002 секунд ...

0 голосов
/ 07 ноября 2018

Если вы сохранили свой документ в корзине с именем «test», этот запрос N1QL будет извлекать искомые элементы в нем:

select item 
from test unnest mydata item 
where "en" in item.languages OR "it" in item.languages

Для выполнения этого запроса вам потребуется как минимум первичный индекс в корзине.

...