Azure CosmosDB Содержит метод не работает - PullRequest
0 голосов
/ 05 ноября 2018

Я не уверен, но думаю, что нашел ошибку в Azure Cosmos DB. Вот моя ситуация. У меня есть следующий JSON

{
    "id": "token",
    "User": {
        "UserToken": "token",
        "Email": "email@email.com"
    },
    "_ts": 1521728825
}

И я написал следующий запрос, используя LINQ:

await _dbClient.Where<UserDocument>(_collectionUri,feedOptions,  
        d => d.User.UserToken == searchString
             || d.User.Email.Contains(searchString))                        
    .OrderByDescending(d => d.Timestamp)
    .AsDocumentQuery().ToListAsync())

Когда я запускаю его с searchString=="token", он возвращает пустой список, поэтому я решаю изменить запрос:

await _dbClient.Where<UserDocument>(_collectionUri,feedOptions,  
        d => d.User.UserToken == searchString)                        
    .OrderByDescending(d => d.Timestamp)
    .AsDocumentQuery().ToListAsync())

Волшебным образом это начало работать. Может кто-нибудь сказать мне, что я делаю не так? или Мэйби есть проблема с CONTAINS методом в CosmosDB ??

1 Ответ

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

Это не ошибка. Это связано с политикой индексации вашей коллекции.

Я не знаю, как выглядит ваша политика индексирования в настоящее время, но когда точное совпадение работает, а частичное совпадение в строке отсутствует, можно с уверенностью сказать, что вы используете индекс Hash для своих строк. .

При использовании хэша только проверки на равенство будут возвращать значения. Вам потребуется изменить строковый индекс на Range и точность -1, чтобы частично соответствовать строкам.

Настройки индекса можно найти в разделе Scale & Settings Проводника данных.

Если ваша политика индексирования выглядит следующим образом:

enter image description here

Затем изменим это на:

enter image description here

Должно работать.

Однако вы можете ограничить это еще больше и индексировать /User/Email/? как Range, а оставшиеся - как хэши.

Вы также можете переопределить это поведение, предоставив объекту FeedOptions со значением EnableScanInQuery, установленным на true. Однако я получил смешанные результаты с этим, поэтому я бы пошел с изменением индекса.

Я настоятельно рекомендую вам взглянуть на документацию по индексированию здесь . Также есть отличное видео, объясняющее больше об этом.

...